SOCKET UDP

Server:

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include<winsock.h>
#pragma comment( lib, "ws2_32.lib" )
int main()
{
	WSADATA WSAData;

	if( WSAStartup( MAKEWORD( 1, 1 ), &WSAData ) )//初始化
	{
		printf( "initializationing error!\n" );
		WSACleanup( );
		exit( 0 );
	}
	int socket_server;
	socket_server=socket(AF_INET,SOCK_DGRAM,0);
	if(socket_server==-1)
	{
		perror("socket() error\n");
		exit(1);
	}
	struct sockaddr_in seraddr;
	seraddr.sin_family=AF_INET;
	seraddr.sin_port=htons(6000);
	seraddr.sin_addr.s_addr=htonl(INADDR_ANY);
	int ans=bind(socket_server,(struct sockaddr*)&seraddr,sizeof(struct sockaddr));
	if(ans==-1)
	{
		perror("bind error\n");
		exit(1);
	}
	struct sockaddr_in client;
	int len=sizeof(struct sockaddr_in);
	char buf[30];
	while(1)
	{		
		recvfrom(socket_server,buf,30,0,(struct sockaddr*)&client,&len);
		//close(socket_tmp);
		printf("%s\n",buf);
		sendto(socket_server,"server",30,0,(struct sockaddr*)&client,len);
	}
	//closesocket(socket_server);
}


Client:

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include<winsock.h>
#pragma comment( lib, "ws2_32.lib" )
int main()
{
	WSADATA WSAData;

	if( WSAStartup( MAKEWORD( 1, 1 ), &WSAData ) )//初始化
	{
		printf( "initializationing error!\n" );
		WSACleanup( );
		exit( 0 );
	}
	int socket_my;
	socket_my=socket(AF_INET,SOCK_DGRAM,0);
	if(socket_my==-1)
	{
		perror("socket() error\n");
		exit(1);
	}
	int nNetTimeout=1000;
	setsockopt(socket_my,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int)); 
	struct sockaddr_in seraddr;
	seraddr.sin_family=AF_INET;
	seraddr.sin_port=htons(6000);
	seraddr.sin_addr.s_addr=inet_addr("127.0.0.1");
	int len=sizeof(struct sockaddr_in);
	char buf[30];
	while(1)
	{
		sendto(socket_my,"client",30,0,(struct sockaddr*)&seraddr,len);
		recvfrom(socket_my,buf,30,0,NULL,NULL);
		printf("%s\n",buf);
	}
}

UDP通信过程如下:

  1. 服务器端绑定一固定udp端口,等待接收客户端的通信。
  2. 客户端通过服务器的ip和地址信息直接对服务器端发送消息。
  3. 服务器端收到客户端发送的消息后获取客户端的ip和端口信息,通过该地址信息和客户端通信。

UDP不能用send和recv函数。这两个示例程序很容易死锁。(示例程序从在脏数据)

如果在Client里没有这两句的话:

setsockopt(socket_my,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int)); 


recvfrom(socket_my,buf,30,0,NULL,NULL);



 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值