linux下用C语言实现TCP/IP服务器与客户端互相发送数据的socket编程
生活随笔
收集整理的這篇文章主要介紹了
linux下用C语言实现TCP/IP服务器与客户端互相发送数据的socket编程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
linux下用C語言實現TCP/IP服務器與客戶端互相發送數據的socket編程
?
server.c
#include <sys/stat.h>#include <fcntl.h>#include <errno.h>#include <netdb.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#define SERVER_PORT 6666/* 監聽后,一直處于accept阻塞狀態, 直到有客戶端連接, 當客戶端如數quit后,斷開與客戶端的連接 */int main(){//調用socket函數返回的文件描述符int serverSocket;//聲明兩個套接字sockaddr_in結構體變量,分別表示客戶端和服務器struct sockaddr_in server_addr;struct sockaddr_in clientAddr;int addr_len = sizeof(clientAddr);int client;char buffer[200];int iDataNum;//socket函數,失敗返回-1//int socket(int domain, int type, int protocol);//第一個參數表示使用的地址類型,一般都是ipv4,AF_INET//第二個參數表示套接字類型:tcp:面向連接的穩定數據傳輸SOCK_STREAM//第三個參數設置為0if((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("socket");return 1;}bzero(&server_addr, sizeof(server_addr));//初始化服務器端的套接字,并用htons和htonl將端口和地址轉成網絡字節序server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);//ip可是是本服務器的ip,也可以用宏INADDR_ANY代替,代表0.0.0.0,表明所有地址server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//對于bind,accept之類的函數,里面套接字參數都是需要強制轉換成(struct sockaddr *)//bind三個參數:服務器端的套接字的文件描述符,if(bind(serverSocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){perror("connect");return 1;}//設置服務器上的socket為監聽狀態if(listen(serverSocket, 5) < 0){perror("listen");return 1;}while(1){printf("監聽端口: %d\n", SERVER_PORT);//調用accept函數后,會進入阻塞狀態//accept返回一個套接字的文件描述符,這樣服務器端便有兩個套接字的文件描述符,//serverSocket和client。//serverSocket仍然繼續在監聽狀態,client則負責接收和發送數據//clientAddr是一個傳出參數,accept返回時,傳出客戶端的地址和端口號//addr_len是一個傳入-傳出參數,傳入的是調用者提供的緩沖區的clientAddr的長度,以避免緩沖區溢出。//傳出的是客戶端地址結構體的實際長度。//出錯返回-1client = accept(serverSocket, (struct sockaddr*)&clientAddr, (socklen_t*)&addr_len);if(client < 0){perror("accept");continue;}printf("等待消息...\n");//inet_ntoa ip地址轉換函數,將網絡字節序IP轉換為點分十進制IP//表達式:char *inet_ntoa (struct in_addr);printf("IP is %s\n", inet_ntoa(clientAddr.sin_addr));printf("Port is %d\n", htons(clientAddr.sin_port));while(1){printf("讀取消息:");buffer[0] = '\0';iDataNum = recv(client, buffer, 1024, 0);if(iDataNum < 0){perror("recv null");continue;}buffer[iDataNum] = '\0';if(strcmp(buffer, "quit") == 0)break;printf("%s\n", buffer);printf("發送消息:");scanf("%s", buffer);printf("\n");send(client, buffer, strlen(buffer), 0);if(strcmp(buffer, "quit") == 0)break;}}close(serverSocket);return 0;}client.c
#include <sys/stat.h>#include <fcntl.h>#include <errno.h>#include <netdb.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#define SERVER_PORT 6666/* 連接到服務器后,會不停循環,等待輸入, 輸入quit后,斷開與服務器的連接 */int main(){//客戶端只需要一個套接字文件描述符,用于和服務器通信int clientSocket;//描述服務器的socketstruct sockaddr_in serverAddr;char sendbuf[200];char recvbuf[200];int iDataNum;if((clientSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("socket");return 1;}serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(SERVER_PORT);//指定服務器端的ip,本地測試:127.0.0.1//inet_addr()函數,將點分十進制IP轉換成網絡字節序IPserverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");if(connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0){perror("connect");return 1;}printf("連接到主機...\n");while(1){printf("發送消息:");scanf("%s", sendbuf);printf("\n");send(clientSocket, sendbuf, strlen(sendbuf), 0);if(strcmp(sendbuf, "quit") == 0)break;printf("讀取消息:");recvbuf[0] = '\0';iDataNum = recv(clientSocket, recvbuf, 200, 0);recvbuf[iDataNum] = '\0';printf("%s\n", recvbuf);}close(clientSocket);return 0;}?
總結
以上是生活随笔為你收集整理的linux下用C语言实现TCP/IP服务器与客户端互相发送数据的socket编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++语言学习思维导图
- 下一篇: BigDecimal的四舍五入的Roun