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

 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值