网络通信_UDP客户端以及服务器

来源:互联网 发布:淘宝客服提成2个点 编辑:程序博客网 时间:2024/06/13 11:06

 UDP协议

  UDP位于IP层之上,每个UDP报文分为UDP报头和UDP数据两个部分;报头由四个16位长字段组成,如下图所示:


UDP客户端与服务器通信流程图



具体代码

客户端:
#include<stdio.h>#include<winsock2.h>#pragma comment(lib,"ws2_32.lib")int main(){WSADATA wsa;SOCKET serversoc;SOCKADDR_IN serveraddr;SOCKADDR_IN peeraddr;int peer_len=sizeof(peeraddr);char Recv_buf[64];//char *Server_IP="127.0.0.1";char *Send_data="Hello,server!";int Send_len=strlen(Send_data);int time_out=2000;    //接收超时int result;    WSAStartup(WINSOCK_VERSION,&wsa);//初始化WS2_32.DLL    //命名协议,IP,端口    serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(13);serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");if(serveraddr.sin_addr.s_addr==INADDR_NONE){printf("不可用地址!\n");return -1;}    //创建套接字serversoc = socket(AF_INET,SOCK_DGRAM,0);    result = setsockopt(serversoc,SOL_SOCKET,SO_RCVTIMEO,(char*)&time_out,sizeof(time_out));    for(int i=0;i<3;i++){    //发送数据result = sendto(serversoc,Send_data,Send_len,0,(SOCKADDR *)&serveraddr,sizeof(serveraddr));//接收数据result = recvfrom(serversoc,Recv_buf,64,0,(SOCKADDR *)&peeraddr,&peer_len);if(result >= 0){Recv_buf[result]= 0;printf("接收数据为:  %s \n",Recv_buf);}}    closesocket(serversoc);WSACleanup();    return 0;}



服务端:
#include<stdio.h>#include<winsock2.h>#include<time.h>#pragma comment(lib,"ws2_32.lib")int main(){WSADATA wsa;WSAStartup(WINSOCK_VERSION,&wsa);//初始化WS2_32.DLLSOCKET serversoc;SOCKET clientsoc;SOCKADDR_IN serveraddr;SOCKADDR_IN clientaddr;int client_len = sizeof(clientaddr);int server_len = sizeof(serveraddr);char *Send_data;int Send_len;char Recv_buf[64];int result;time_t nowtime;//命名协议,IP,端口        serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(13);serveraddr.sin_addr.s_addr = INADDR_ANY;//创建socketserversoc = socket(AF_INET,SOCK_DGRAM,0);//绑定socketresult=bind(serversoc, (SOCKADDR *)&serveraddr, server_len);if(result==SOCKET_ERROR){printf("套接字绑定失败!\n");closesocket(serversoc);return -1;}printf("Server is running.....\n");clientsoc = socket(AF_INET,SOCK_DGRAM,0);while(1){   //接收数据result = recvfrom(serversoc,Recv_buf,64,0,(SOCKADDR *)&clientaddr,&client_len);if(result >= 0){Recv_buf[result]= 0;printf("接收数据为:  %s \n",Recv_buf);    //发送数据nowtime=time(0);Send_data=ctime(&nowtime);Send_len=strlen(Send_data);     result = sendto(clientsoc,Send_data,Send_len,0,(SOCKADDR *)&clientaddr,sizeof(clientaddr));printf("Server is running.....\n");}}closesocket(serversoc);WSACleanup();return 0;}




参考文章:
http://blog.csdn.net/lovecodeless/article/details/25388291
http://blog.csdn.net/mao834099514/article/details/52763490?locationNum=2&fps=1

0 0
原创粉丝点击