利用套接字实现UDP 通信 小测

服务器端(接收端)程序:

1、创建套接字(socket)。 

2、将套接字绑定到一个本地地址和端口上(bind)。

3、等待接收数据(recvfrom)。

4、关闭套接字。

#include<WinSock2.h>
#include<stdio.h>

int main()
{
	//加载套字节库
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	wVersionRequested = MAKEWORD( 2, 2 );
	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) {
		/* Tell the user that we could not find a usable */
		/* WinSock DLL.                                  */
		return 1;
	}

	//创建套字节
	SOCKET serv_socket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);

	//绑定套字节
	SOCKADDR_IN servaddr;
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(7015);                        //端口号
	//servaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //主机测试地址  
	//servaddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.102"); //路由中,主机真实地址
	servaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
	bind(serv_socket,(SOCKADDR*)&servaddr ,sizeof(servaddr));

	//接收信息
	char RecvBuf[100];
	int  BufLen = 100;
	SOCKADDR_IN SenderAddr;   //发送端的地址
	int SenderAddrSize = sizeof(SenderAddr);
	recvfrom(serv_socket, RecvBuf, BufLen, 0,  (SOCKADDR *)&SenderAddr, &SenderAddrSize);
	printf("%s :%s\n",RecvBuf,inet_ntoa(SenderAddr.sin_addr));

	//-----------------------------------------------
	// Close the socket when finished receiving datagrams
	printf("Finished receiving. Closing socket.\n");
	closesocket(serv_socket);

	//-----------------------------------------------
	// Clean up and exit.
	printf("Exiting.\n");
	WSACleanup();

	return true;
}
关于INADDR_ANY

用于多IP机器上   

 比如机器有三个ip  ->  192.168.1.1     202.202.202.202     61.1.2.3   
 如果你serv.sin_addr.s_addr=inet_addr("192.168.1.102");     然后监听7015端口   

 这时其他机器只有connect  192.168.1.102:7015才能成功。   
  connect   202.202.202.202:7015和connect   61.1.2.3:7015都会失败。   
    
  如果serv.sin_addr.s_addr=htonl(INADDR_ANY); 的话,无论连接哪个ip都可以连上的。

客户端(发送端)程序:

1、创建套接字(socket)。 

2、向服务器发送数据(sendto)。

3、关闭套接字。

#include<WinSock2.h>
#include<stdio.h>

int main()
{
	//加载套字节库
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested = MAKEWORD( 2, 2 );

	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) {
		/* Tell the user that we could not find a usable */
		/* WinSock DLL.                                  */
		return 1;
	}

	//创建套字节
	SOCKET send_socket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);


	//发送信息
	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.102"); //接收端的服务器地址
	addrSrv.sin_family=AF_INET;
	addrSrv.sin_port=htons(7015);  //服务器的信息

	printf("Sending a datagram to the receiver...\n");
	sendto(send_socket,"Hello",strlen("Hello")+1,0,  (SOCKADDR *)&addrSrv, sizeof(SOCKADDR));

	//---------------------------------------------
	// When the application is finished sending, close the socket.
	printf("Finished sending. Closing socket.\n");
	closesocket(send_socket);

	//---------------------------------------------
	// Clean up and quit.
	printf("Exiting.\n");
	WSACleanup();


	return true;
}
测试结果:先启动接收端,然后启动发送端

接收端开启时:



发送端:


接收端:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值