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

本文提供了一个使用UDP协议进行客户端与服务器通信的示例代码,包括如何设置客户端与服务器、发送及接收数据等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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.youkuaiyun.com/lovecodeless/article/details/25388291
http://blog.youkuaiyun.com/mao834099514/article/details/52763490?locationNum=2&fps=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值