您的位置:首页 > 理论基础 > 计算机网络

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

2017-03-24 14:30 369 查看

 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.DLL

SOCKET 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;

//创建socket
serversoc = socket(AF_INET,SOCK_DGRAM,0);

//绑定socket
result=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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: