編譯環境: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 }
