套接字编程基本框架
client.c文件
1 #include<sys/socket.h> 2 #include<sys/types.h> 3 #include<stdio.h> 4 #include<netinet/in.h> 5 #include<arpa/inet.h> 6 #include<errno.h> 7 #include<string.h> 8 #include<stdlib.h> 9 #include<unistd.h> 10 int main() 11 { 12 //int socket(int domain, int type, int protocol); 13 int sockfd; 14 sockfd=socket(AF_INET,SOCK_STREAM,0); 15 printf("sockfd=%d\n",sockfd); 16 17 /* 18 int connect(int sockfd, struct sockaddr *serv_addr, int addrlen ); 19 作用:向服务器请求三次握手 20 参数1:套接字 21 参数2:服务端的地址族结构,也就是地址类型,IP,端口 22 参数3:服务端地址族的大小 23 返回值:成功则返回非负数 24 */ 25 struct sockaddr_in seraddr; 26 seraddr.sin_family=AF_INET; 27 seraddr.sin_port=htons(7319); 28 inet_pton(AF_INET,"192.168.6.11",&seraddr.sin_addr.s_addr); 29 30 int ret=connect(sockfd,(struct sockaddr *)&seraddr,sizeof(seraddr)); 31 if(ret<0) 32 perror("connect failed:"); 33 exit(0); 34 } 35 36 char buf[20]; 37 scanf("%s",buf); 38 write(sockfd,buf,strlen(buf)+1); 39 close(sockfd); 40 41 return 0;
server.c文件
1 #include<sys/socket.h> 2 #include<sys/types.h> 3 #include<stdio.h> 4 #include<netinet/in.h> 5 #include<arpa/inet.h> 6 #include<errno.h> 7 #include<string.h> 8 #include<stdlib.h> 9 #include<unistd.h> 10 int main() 11 { 12 /* 13 int socket(int domain, int type, int protocol); 14 作用:创建套接字。在服务器,该套接字用于监听 15 参数1:使用的协议如IPv4用 AF_INET 16 参数2:使用的协议的类型,type指定协议类型,SOCK_STREAM指定字节流协议(如TCP),SOCK_DGRAM指定数据报协议(如UDP), 17 参数3:具体的协议,这里填NULL. 18 返回值:返回套接字文件描述符 19 */ 20 21 int listenfd; 22 23 listenfd=socket(AF_INET,SOCK_STREAM,0); 24 printf("listenfd=%d\n",listenfd); 25 26 /* 27 int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen); 28 作用:将用于监听的套接字与服务器的端口已经IP进行捆绑。 29 第一个参数: 用于监听的套接字。 30 第二个参数:服务器的IP,端口,已经协议的类型。这里使用的是通用的地址协 31 议族,使用的时候,需要将我们的IPv4地址协议族转换成通用的地址协议族 32 第三个参数:地址族占用的空间的大小 33 */ 34 struct sockaddr_in myaddr; 35 myaddr.sin_family=AF_INET; 36 myaddr.sin_port=htons(7319); 37 inet_pton(AF_INET,"192.168.6.11",&myaddr.sin_addr.s_addr); 38 39 int ret=bind(listenfd,(struct sockaddr *)&myaddr,sizeof(myaddr)); 40 if(ret<0) 41 { 42 perror("bind failed:"); 43 exit(0); 44 } 45 /* 46 int listen(int sockfd, int backlog); 47 作用:用于监听绑定的套接字是否有人请求三次握手。 48 第一个参数:bind之后的套接字 49 第二个参数:同一时间允许等待队列的大小 50 返回值:成功则返回非负数 51 */ 52 ret=listen(listenfd,20); 53 if(ret<0) 54 { 55 perror("listen failed:"); 56 exit(0); 57 } 58 /* 59 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 60 作用:接收三次握手,建立端对端的链接 61 参数1:用于监听的套接字 62 参数2:用于接收客户端的地址族结构。 63 参数3:客户端地址族的大小的地址 64 返回值:链接之后的套接字,这个套接字就是负责和客户端进行数据传输 65 */ 66 struct sockaddr_in caddr; 67 int len=sizeof(caddr); 68 int confd; 69 70 while(1) 71 { 72 confd=accept(listenfd,(struct sockaddr*)&caddr,&len); 73 if(confd<0) 74 { 75 perror("accept failed:"); 76 exit(0); 77 } 78 79 char buf[100]; 80 81 ret=read(confd,buf,100); 82 if(ret<0) 83 { 84 perror("read failed:"); 85 exit(0); 86 } 87 else if(ret==0) 88 { 89 90 else 91 { 92 printf("ret=%d buf=%s\n",ret,buf); 93 } 94 } 95 }