TCP通訊程序設計
這里主要包含客戶機和服務器的編程。
一、編程模型函數化
使用函數說明:socket的理解
服務器:
創建socket使用函數----->socket
綁定地址使用函數------->bind
監聽端口使用函數------->listen
等待連續使用函數------->accept
收發使用函數---------->recv/send
結束連續-------------->close
客戶機:
創建socket使用函數----->socket
連接服務器函數--------->connect
收發使用函數----------->send/recv
結束連接使用函數------->close
二、首先編寫服務器的代碼
touch tcp_server.c
chmod 777 tcp_server.c
代碼如下:
1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/socket.h> 4 #include <string.h> 5 #include <netinet/in.h> 6 7 #define portnum 3333 8 9 int main() 10 { 11 int sockfd; 12 int new_fd; 13 char buffer[128]; 14 int sin_size; 15 struct sockaddr_in server_addr; 16 struct sockaddr_in client_addr; 17 int nbyte=10; //表示打印前10個字符 18 //1.創建套接字 19 if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) 20 { 21 printf("creat socket error!\n"); 22 exit(1); 23 } 24 25 //2.1設置綁定的地址 26 bzero(&server_addr,sizeof(struct sockaddr_in)); 27 server_addr.sin_family = AF_INET; 28 server_addr.sin_port = htons(portnum); 29 server_addr.sin_addr.s_addr = htonl(INADDR_ANY); 30 31 //2.2綁定地址 32 bind(sockfd, (struct sockaddr *)(&server_addr),sizeof(struct sockaddr)); 33 34 //3.監聽端口 35 listen(sockfd,5); 36 37 while(1) 38 { 39 //4.等待連接 40 sin_size = sizeof(struct sockaddr); 41 new_fd = accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size); 42 printf("server get connection %s\n",inet_ntoa(client_addr.sin_addr)); 43 44 //5.接受數據 45 recv(new_fd,buffer,128,0); 46 buffer[nbyte] = '\0'; 47 printf("server receive : %s\n",buffer); 48 49 //6.結束連接 50 close(new_fd); 51 } 52 close(sockfd); 53 }
編譯運行:gcc tcp_server.c -o tcp_server ---------->./tcp_server
三、編寫客戶機的代碼
touch tcp_client.c
chmod 777 tcp_client.c
代碼如下:
1 #include <stdio.h> 2 #include <string.h> 3 #include <sys/socket.h> 4 #include <sys/types.h> 5 #include <netinet/in.h> 6 7 #define portnum 3333 8 9 int main() 10 { 11 int sockfd; 12 char buffer[128]; 13 struct sockaddr_in server_addr; 14 //1.創建套接字 15 if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) 16 { 17 printf("creat socket error!\n"); 18 exit(1); 19 } 20 //2.1設置要連接色服務器的地址 21 bzero(&server_addr,sizeof(struct sockaddr_in)); 22 server_addr.sin_family = AF_INET; 23 server_addr.sin_port = htons(portnum); 24 server_addr.sin_addr.s_addr = inet_addr("192.168.58.128"); 25 26 //2.2連接服務器 27 if (connect(sockfd,(struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1) 28 { 29 printf("connect error! \n"); 30 } 31 32 //3.發送數據到服務器 33 printf("please input char:\n"); 34 fgets(buffer,128,stdin); 35 send(sockfd,buffer,strlen(buffer),0); 36 //4.關閉連接 37 close(sockfd); 38 return 0; 39 }
編譯運行gcc tcp_client.c -o tcp_client-------------->./tcp_client
四、運行結果如下
1.服務器運行進入等待
2.在客戶機等待輸入的字符中輸入字符
3.可以看到服務器收到信息並且打印出來