udp編程 實例
阿新 • • 發佈:2017-11-02
clu char unistd.h 接收 完整 發送數據 get 客戶端 style
server端
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> void server(int sock){ //1、建立接收緩存字節數組 char recvbuf[1024] = {0}; //2、定義socket struct sockaddr_in peeraddr; socklen_t peerlen; int n; while(1){ // peerlen = sizeof(peeraddr); //3、清空接收緩存數組 memset(recvbuf, 0, sizeof(recvbuf)); //4、開始接收數據 n = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&peeraddr, &peerlen); //5、判斷是否接收完整數據 if(n == -1){ perror("recvfrom"); exit(EXIT_FAILURE); }else if(n > 0){ //6、成功接收數據,將緩存數據寫入到標準輸出,打印到控制臺 fputs(recvbuf, stdout); //7、想客戶端回送接收到的數據(回顯客戶端輸入的數據)sendto(sock, recvbuf, n, 0, (struct sockaddr *)&peeraddr, peerlen); } } //關閉socket close(sock); } int main(void){ int sock; //創建服務器socket if((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0){ perror("socket error"); exit(EXIT_FAILURE); } //設置服務器socket參數 struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); //設置socket的協議、端口以及地址 servaddr.sin_family = AF_INET; servaddr.sin_port = htons(5188); servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //將socket綁定地址 if(bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){ perror("bind error"); exit(EXIT_FAILURE); } server(sock); return 0; }
client端
#include <unistd.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> void client(int sock){ //2、設置客戶端socket參數 struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); //3、設置傳輸協議、端口以及目的地址 servaddr.sin_family = AF_INET; servaddr.sin_port = htons(5188); servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //4、創建發送與接收緩存字節數組 int ret; char sendbuf[1024] = {0}; char recvbuf[1024] = {0}; //5、開始發送數據(此處是發送來自標準輸入的數據) while(fgets(sendbuf, sizeof(sendbuf), stdin) != NULL){ sendto(sock, sendbuf, strlen(sendbuf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); //6、開始接收數據,接收服務端返回的數據 ret = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, NULL, NULL); if(ret == -1){ perror("recvfrom"); exit(EXIT_FAILURE); } //fputs(recvbuf, stdout); //將服務端返回的數據寫入到標準輸出 //7、清空發送與接收緩存 memset(sendbuf, 0, sizeof(sendbuf)); memset(recvbuf, 0, sizeof(recvbuf)); } //8、關閉socket流 close(sock); } int main(void){ int sock; //1.創建客戶端的socket if((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0){ perror("socket"); exit(EXIT_FAILURE); } client(sock); return 0; }
udp編程 實例