Linux C 套接字socket TCP(1)
来源:互联网 发布:nginx conf配置详解 编辑:程序博客网 时间:2024/06/06 10:49
1、创建套接字
例:int sockfd; sockfd = socket(AF_INET, SOCK_STREAM, 0);
socket () 函数:
int socket(int domain, int type, int protocol)
//参数domain;设置网络通信的域,即选择通信协议族。AF_INET为IPv4
//参数type:设置套接字通信的类型,主要有SOCK_STREAM(流式套接字,TCP连接)、SOCK_DGRAM(数据包套接字,UDP连接)
//参数protocol:制定type协议类型中的某个特定类型。通常某协议中只有一种特定类型,即protocol参数仅能设为0
//创建 套接字
2、结构体 struct sockaddr_in //库 <netinet/in.h>
//short int sin_family; 协议族,在socket编程中 只能是AF_INET
//unsigned short int sin_port; 端口号,使用网络字节顺序
//struct in_addr sin_addr; 含unsigned long s_addr; 存储IP地址
//unsigned char sin_zero[8];
例:
struct sockaddr_in servAddr;
bzero(&servAddr, sizeof(servAddr)); //初始化 servAddr变量
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(8888);
servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
3、客户端 连接 、 读取
例:
connect(sockfd, (struct sockaddr *)&servAddr, sizeof(servAddr)); //连接 套接字 和 IP
int rcvLen; rcvLen = read(sockfd, rcvbuf, 128); //读取 信息
4、函数 setsockopt() //设置套接字属性
//int setsockopt(SOCKET s, int level, int optname, const char *optval, int optlen);
//参数s;套接字,指向一个打开的套接口描述符
//参数level:级别,SOL_SOCKET(基本套接口)
//参数optname:选项名,SO_REUSEADDR(允许套接口和已使用的地址捆绑)
//参数optval:选项值,
//参数optlen:选项长度,
例:
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); //设置套接字属性
5、服务端 绑定、监听、写入
例:
bind(sockfd, (struct sockaddr *)&serAddr, sizeof(struct sockaddr)); //绑定 套接字 和 IP、端口
listen(sockfd, 2); //设置 可同时监听的最大数量
listenfd = accept(sockfd, (struct sockaddr *)&cliAddr,&len);
write(sockfd,"test",5);
代码(其一):
1 #include <stdio.h> 2 #include <netinet/in.h> 3 #include <string.h> 4 #include <time.h> 5 6 int main(int argc, char *argv[]) 7 { 8 int sockfd, listenfd; 9 int opt = 1; 10 11 struct sockaddr_in serAddr, cliAddr; 12 socklen_t len; 13 14 time_t mytime; 15 char buf[128]; 16 17 sockfd = socket(AF_INET, SOCK_STREAM, 0); 18 printf("server socket create success. sockfd = %d\n", sockfd); 19 printf(" ***********************************\n"); 20 21 //int setsockopt(SOCKET s, int level, int optname, const char *optval, int optlen); 22 //参数s;套接字,指向一个打开的套接口描述符 23 //参数level:级别,SOL_SOCKET(基本套接口) 24 //参数optname:选项名,SO_REUSEADDR(允许套接口和已使用的地址捆绑) 25 //参数optval:选项值, 26 //参数optlen:选项长度, 27 setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); //设置套接字属性 28 29 bzero(&serAddr, sizeof(serAddr)); //初始化 serAddr变量 30 serAddr.sin_family = AF_INET; 31 serAddr.sin_port = htons(8888); 32 serAddr.sin_addr.s_addr = htonl(INADDR_ANY); 33 34 //server端 bind 绑定 35 bind(sockfd, (struct sockaddr *)&serAddr, sizeof(struct sockaddr)); //绑定 套接字 和 IP、端口 36 listen(sockfd, 2); //设置 可同时监听的最大数量 37 38 printf("waiting for being connected ......\n"); 39 listenfd = accept(sockfd, (struct sockaddr *)&cliAddr,&len); 40 printf("finish connect listenfd = %d\n", listenfd); 41 printf(" **********************\n"); 42 if(listenfd < 0) 43 { 44 perror("ERROR: accept failure.\n"); 45 return -1; 46 } 47 48 mytime = time(NULL); 49 snprintf(buf, sizeof(buf), "%s", ctime(&mytime)); //缓存变量 50 51 // write(sockfd,"test",5); 52 write(listenfd, buf, strlen(buf)); //写入(发送) 53 printf("send socket[%d bytes]: %s\n", strlen(buf), buf); 54 close(sockfd); 55 return 0; 56 }
代码(其二):
1 #include <stdio.h> 2 #include <netinet/in.h> 3 #include <string.h> 4 //#include <sys/socket.h> 5 6 int main(int argc, char *argv[]) 7 { 8 int sockfd; 9 10 //short int sin_family; 协议族,在socket编程中 只能是AF_INET 11 //unsigned short int sin_port; 端口号,使用网络字节顺序 12 //struct in_addr sin_addr; 含unsigned long s_addr; 存储IP地址 13 //unsigned char sin_zero[8]; 14 struct sockaddr_in servAddr; //库 <netinet/in.h> 15 16 int rcvLen; 17 char rcvbuf[128]; 18 19 //int socket(int domain, int type, int protocol) 20 //参数domain;设置网络通信的域,即选择通信协议族。AF_INET为IPv4 21 //参数type:设置套接字通信的类型,主要有SOCK_STREAM(流式套接字,TCP连接)、SOCK_DGRAM(数据包套接字,UDP连接) 22 //参数protocol:制定type协议类型中的某个特定类型。通常某协议中只有一种特定类型,即protocol参数仅能设为0 23 sockfd = socket(AF_INET, SOCK_STREAM, 0); //创建 套接字 24 printf("client socket create success. sockfd = %d\n", sockfd); 25 26 bzero(&servAddr, sizeof(servAddr)); //初始化 servAddr变量 27 servAddr.sin_family = AF_INET; 28 servAddr.sin_port = htons(8888); 29 servAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 30 31 //client端 connect 连接 32 connect(sockfd, (struct sockaddr *)&servAddr, sizeof(servAddr)); //连接 套接字 和 IP 33 rcvLen = read(sockfd, rcvbuf, 128); //读取 信息 34 35 if(rcvLen < 0) 36 { 37 printf("ERROR: read failure.\n"); 38 return -1; 39 } 40 if(rcvLen == 0) 41 { 42 printf("Server close connection.\n"); 43 return -1; 44 } 45 printf("receive data[%d bytes]: %s\n", rcvLen, rcvbuf); 46 47 close(sockfd); 48 49 return 0; 50 }
执行:
- Linux C 套接字socket TCP(1)
- Socket套接字/TCP
- windows套接字(socket)TCP篇
- Linux C 套接字socket UDP
- Linux C 套接字socket select
- 【socket】TCP套接字编程
- socket套接字TCP API
- Linux网络编程【一】:TCP socket套接字详解
- (四十九)socket编程——网络套接字函数及建立C/S模型(TCP)
- linux Tcp 套接字
- Linux Socket套接字
- Linux下套接字详解(二)----套接字Socket
- Linux TCP/IP协议栈之Socket的实现分析 第一部份 Socket套接字的创建 (-)
- Socket套接字编程(一)——TCP编程
- 使用TCP/IP的套接字(Socket)进行通信
- 使用TCP/IP的套接字(Socket)进行通信
- 【HTTP】TCP连接与套接字编程(socket)理论基础
- 使用TCP/IP的套接字(Socket)进行通信
- CodeM4
- mybatis知识解惑
- IOS 杂笔-15(知识小点 readonly)
- ANDROID STUDIO系列教程五--GRADLE命令详解与导入第三方包
- python中计时工具timeit模块的基本用法
- Linux C 套接字socket TCP(1)
- IOS 杂笔-14(被人遗忘的owner)
- Fiddler工具常用功能使用图述
- 一些期刊的影响因子
- IOS 杂笔-13(appearance的巧妙使用)
- week15- NO.402. Remove K Digits
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—C(隔板法)
- 每日算法(一)
- IOS 杂笔-12(类别de巧用 有便于Frame的操作)