實如今Linux環境下的UDP通訊測試。服務器
註釋了while循環,將代碼規範化。socket
udpserver.c代碼:ide
/********************************************************************** * 版權全部 (C)2016, WangSq。 * * 文件名稱:xx.c * 文件標識:無 * 內容摘要:udpserver演示程序 * 其它說明:無 * 當前版本:V1.0 * 做 者:WangSq * 完成日期:2016 * **********************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> /********************socket相關******************************************/ //socket參數 #define SERVER_PORT 2234 /*監聽端口*/ #define MAX_MSG_SIZE 256 /*recv緩衝器大小*/ int sockfd; //套接字描述符 /*客戶機的地址信息及長度信息*/ struct sockaddr_in client; int client_len=sizeof(struct sockaddr_in); //udp服務器監聽函數初始化 void udpser_init() { /*服務器的地址信息*/ struct sockaddr_in server; /*服務器填充sockaddr server結構*/ bzero(&server,sizeof(server)); server.sin_family=AF_INET; server.sin_addr.s_addr=htonl(INADDR_ANY); server.sin_port=htons(SERVER_PORT); /*服務器創建socket描述符*/ if(-1 == (sockfd=socket(AF_INET, SOCK_DGRAM,0))) { perror("create socket failed"); exit (1); } /*捆綁socket描述符sockfd*/ if(-1 == ( bind( sockfd, ( struct sockaddr * )&server, sizeof(server) )) ) { perror("bind error"); exit (1); } } /*接收緩衝區--------------------len =4-----------------*/ unsigned char message[MAX_MSG_SIZE]; int recv_len=0; /* IP地址的存放緩衝區*/ char addr_p[INET_ADDRSTRLEN]; char *sndbuf = "Hello! i am OK.\n"; /********************************************************************** * 功能描述:主函數 * 輸入參數:無 * 輸出參數:無 * 返 回 值:無 * 其它說明:無 * 修改日期 版本號 修改人 修改內容 * ------------------------------------------------------------------- * 2016xxxx V1.0 WangSq 建立 ***********************************************************************/ int main(int argc, char *argv[]) { //udp服務器監聽函數初始化 udpser_init(); // while(1) // { /********************************接收數據並打印*************************/ recv_len=recvfrom(sockfd,message,sizeof(message),0,(struct sockaddr *)&client,&client_len); //阻塞式 if(recv_len <0) { printf("recvfrom error\n"); exit(1); } /*打印客戶端地址和端口號*/ inet_ntop(AF_INET,&client.sin_addr,addr_p,sizeof(addr_p)); printf("client IP is %s, port is %d\n",addr_p,ntohs(client.sin_port)); message[recv_len]='\0'; /*顯示消息長度*/ printf("server received %d:%s\n", recv_len, message); /********************************回發數據*************************/ if(sendto(sockfd,sndbuf,strlen(sndbuf),0,(struct sockaddr*)&client,client_len)<0) { printf("sendto error\n"); exit(1); } // } return 0; }
udpclient.c代碼:函數
/********************************************************************** * 版權全部 (C)2016, WangSq。 * * 文件名稱:xx.c * 文件標識:無 * 內容摘要:udpclient演示程序 * 其它說明:無 * 當前版本:V1.0 * 做 者:WangSq * 完成日期:2016 * **********************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <unistd.h> /********************************************************************** * 功能描述:主函數 * 輸入參數:無 * 輸出參數:無 * 返 回 值:無 * 其它說明:無 * 修改日期 版本號 修改人 修改內容 * ------------------------------------------------------------------- * 2016xxxx V1.0 WangSq 建立 ***********************************************************************/ #define UDP_TEST_PORT 2234 #define UDP_SERVER_IP "192.168.1.10" #define MAX_LINE 80 int main(int argC, char* arg[]) { struct sockaddr_in server; int sockfd, len = 0; int server_len = sizeof(struct sockaddr_in); char *sendStr ="i am a client\n"; //默認發送串 char buf[MAX_LINE];//接收緩衝區 /* setup a socket,attention: must be SOCK_DGRAM */ if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket"); exit(1); } /*complete the struct: sockaddr_in*/ bzero(&server, sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(UDP_TEST_PORT); server.sin_addr.s_addr = inet_addr(UDP_SERVER_IP); // while(1) { //printf("Please enter a string to send to server: \n"); /* get the string from standard in*/ //len = read(STDIN_FILENO, buf, sizeof(buf)); /* send the string to server*/ if(sendto(sockfd, sendStr, strlen(sendStr), 0, (struct sockaddr *)&server, server_len)<0) //sizeof { printf("sendto error\n"); exit(1); } memset(buf, 0, sizeof(buf)); /* recieve the string from server*/ len = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&server, &server_len); if(len <0) { printf("recvfrom error\n"); exit(1); } printf("Receive from server: %s\n", buf); // } return 0; }
Makefile:測試
all : udpserver udpclient udpserver: udpserver.c gcc udpserver.c -o udpserver udpclient: udpclient.c gcc udpclient.c -o udpclient clean: rm *.o udpserver udpclient .PHONY: clean
很久沒有在這裏寫博客了,但願本身多多加油,多實踐,多思考!spa