socket编程——C实现服务端与客户端间通信实现大小写转换
编译环境:VIM (Ubuntu 16.04)
------------------------------------------------------------------------------------------
更新:1)程序加上了对错误的处理
------------------------------------------------------------------------------------------
常用函数笔记:Socket编程——常用函数
程序包括服务端(server.c)和客户端(client.c),客户端实现从shell中输入小写字母,通过socket也就是套接字将数据发给服务端,服务端实现小写->大写,再将转换好的数据发回客户端。、
执行顺序:server ----> client
结束顺序:client ----> server
如果先终止server的话会导致server绑定的端口不能及时被释放,下次再执行server的时候可能会报错。
server.c
——
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <sys/socket.h> 4 #include <stdlib.h> 5 #include <arpa/inet.h> 6 #include <ctype.h> 7 #include <string.h> 8 9 #define SERV_IP "127.0.0.1" 10 #define SERV_PORT 6666 11 12 int main() 13 { 14 int lfd,cfd; 15 struct sockaddr_in serv_addr, clie_addr; 16 socklen_t clie_addr_len; 17 char buf[BUFSIZ], clie_IP[BUFSIZ]; 18 int n, i, ret; 19 20 lfd = socket(AF_INET, SOCK_STREAM, 0);//IPV4,TCP 21 if(lfd == -1){ 22 perror("socket error"); 23 exit(1); 24 } 25 serv_addr.sin_family = AF_INET;//IPV4 与socket()的参数相同 26 serv_addr.sin_port = htons(SERV_PORT);//本地字节序(小端)->网络字节序(大端) 27 serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY:本地任意IP(点分十进制类型) 28 29 ret = bind(lfd ,(struct sockaddr *)&serv_addr, sizeof(serv_addr)); //绑定 30 if(ret == -1){ 31 perror("bind error"); 32 exit(1); 33 } 34 ret = listen(lfd, 128);//设定最大同时连接数,default:128 35 if(ret == -1){ 36 perror("listen error"); 37 exit(1); 38 } 39 clie_addr_len = sizeof(clie_addr); 40 cfd = accept(lfd,(struct sockaddr *)&clie_addr, &clie_addr_len);//accept():接收一个连接 41 if(cfd == -1){ 42 perror("accept error"); 43 exit(1); 44 } 45 printf("client IP:%s, client Port:%d\n", 46 inet_ntop(AF_INET, &clie_addr.sin_addr.s_addr, clie_IP, sizeof(clie_IP)),ntohs(clie_addr.sin_port)); 47 while(1) 48 { 49 memset(buf,0,sizeof(buf)); 50 n = read(cfd, buf, sizeof(buf)); //服务器程序阻塞在这,从客户端读取 51 if(strcmp(buf, "q\n") == 0) break; 52 for(i = 0; i < n; i++) 53 buf[i] = toupper(buf[i]); //小写 -> 大写 54 write(cfd, buf, n); //写回客户端 55 } 56 close(lfd); 57 close(cfd); 58 59 return 0; 60 }
client.c
——
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <stdlib.h> 4 #include <sys/socket.h> 5 #include <arpa/inet.h> 6 #include <string.h> 7 8 #define SERV_IP "127.0.0.1" 9 #define SERV_PORT 6666 10 int main() 11 { 12 int cfd, n, ret; 13 struct sockaddr_in serv_addr; 14 char buf[BUFSIZ]; 15 cfd = socket(AF_INET, SOCK_STREAM, 0); 16 if(cfd == -1){ 17 perror("socket error"); 18 exit(1); 19 } 20 memset(&serv_addr,0,sizeof(serv_addr)); 21 serv_addr.sin_family = AF_INET; 22 serv_addr.sin_port = htons(SERV_PORT); 23 inet_pton(AF_INET, SERV_IP, &serv_addr.sin_addr); //字符串"127.0.0.1" ---> 网络端格式 24 25 ret = connect(cfd, (struct sockaddr *)&serv_addr, (socklen_t)sizeof(serv_addr)); //连接 26 if(ret == -1){ 27 perror("socket error"); 28 exit(1); 29 } 30 31 while(1) 32 { 33 fgets(buf,sizeof(buf),stdin); //hello world -- fgets --->"hello world\n\0" 34 write(cfd,buf,strlen(buf)); 35 n = read(cfd,buf,sizeof(buf)); 36 write(STDOUT_FILENO,buf,n); 37 } 38 close(cfd); 39 return 0; 40 }