Windows网络编程:Winsock实现UDP通信

在文章Windows网络编程:一文深入理解Winsock里Jungle详细介绍了Winsock的头文件、面向连接的通信(TCP/IP)和无连接的通信(UDP/IP),Windows网络编程:Winsock实现客户端与服务器文件传输(TCP/IP)中Jungle基于Winsock实现了面向连接的通信,即利用TCP/IP协议通信。本文,Jungle将展示利用UDP/IP实现发送端与接收端的通信。

1.接收端

具体步骤和概念在此不再赘述,见Windows网络编程:一文深入理解Winsock

#include <stdio.h>
#include <stdlib.h>

#include <WinSock2.h>
#pragma comment ( lib,"WS2_32.lib" )  

#define RECEIVER_ADDRESS "127.0.0.1"
#define PORT 8000

void transAddrToBuf(SOCKADDR_IN sockAddr, char* buffer)
{
	if (!buffer){
		return;
	}
	sprintf(buffer, "%s:%d", inet_ntoa(sockAddr.sin_addr), ntohs(sockAddr.sin_port));
}

int main()
{
	WSAData wasData;
	SOCKET recvSocket;
	SOCKADDR_IN receiverAddr;
	char recvBuf[1024] = { 0 };
	int recvBufLength = 1024;
	
	SOCKADDR_IN senderAddr;
	memset(&senderAddr, 0, sizeof(senderAddr));
	int senderAddrLength = sizeof(senderAddr);
	char senderInfo[30] = { 0 };

	int ret = -1;

	// 初始化
	WSAStartup(MAKEWORD(2, 2), &wasData);

	// 创建套接字
	// 套接字类型—:UDP/IP-SOCK_DGRAM
	// 协议:UDP-IPPROTO_UDP
	recvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (SOCKET_ERROR == recvSocket){
		printf("Create Socket Error!");
		goto exit;
	}

	// 创建一个SOCKADDR_IN结构,指定接收端地址信息
	receiverAddr.sin_family = AF_INET;   // 使用IP地址族
	receiverAddr.sin_port = htons(PORT); // 端口号
	receiverAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

	// bind将地址信息和套接字关联
	ret = bind(recvSocket, (SOCKADDR*)&receiverAddr, sizeof(receiverAddr));
	if (0 != ret){
		printf("bind error with ErrorNum %d\n",WSAGetLastError());
		goto exit;
	}

	// 接收数据报
	while (1){
		ret = recvfrom(recvSocket, recvBuf, recvBufLength, 0, (SOCKADDR*)&senderAddr, &senderAddrLength);
		if (ret > 0){
			printf("recv info:");
			transAddrToBuf(senderAddr, senderInfo);
			//printf("%s\n", senderInfo);
			printf("%s\n", recvBuf);
		}
	}

exit:
	closesocket(recvSocket);
	system("pause");
	return 0;
}

2.发送端

#include <stdio.h>
#include <WinSock2.h>
#pragma comment ( lib,"WS2_32.lib" )  

#define RECEIVER_ADDRESS "127.0.0.1"
#define PORT 8000

int main()
{
	WSAData wasData;
	SOCKET sendSocket;
	SOCKADDR_IN receiverAddr;
	int addrLength = 0;
	char sendBuf[1024] = "fengqiangguo";
	int sendBufLength = 1024;
	int ret = 0;

	// 初始化
	WSAStartup(MAKEWORD(2, 2), &wasData);

	// 创建套接字
	// 套接字类型—:UDP/IP-SOCK_DGRAM
	// 协议:UDP-IPPROTO_UDP
	sendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (SOCKET_ERROR == sendSocket){
		printf("Create Socket Error!");
		goto exit;
	}

	// 创建一个SOCKADDR_IN结构,指定接收端地址信息
	receiverAddr.sin_family = AF_INET;   // 使用IP地址族
	receiverAddr.sin_port = htons(PORT); // 端口号
	receiverAddr.sin_addr.S_un.S_addr = inet_addr(RECEIVER_ADDRESS);

	while (1){
		if (gets(sendBuf)){
			ret = sendto(sendSocket, sendBuf, sizeof(sendBuf), 0, (SOCKADDR *)&receiverAddr, sizeof(receiverAddr));
			if (0 == ret){
				printf("fail to send\n");
			}
			printf("send info: %s\n", sendBuf);
			memset(sendBuf, 0, sizeof(sendBuf));
		}
	}

exit:
	closesocket(sendSocket);
	system("pause");
	return 0;
}

3.测试


欢迎关注知乎专栏:Jungle是一个用Qt的工业Robot

欢迎关注Jungle的微信公众号:Jungle笔记

回复“资料”,领取Jungle为您精心准备的41本计算机领域经典书籍!
回复“机器人”,领取四大家族相关的机器人资料大礼包!

发布了154 篇原创文章 · 获赞 141 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/sinat_21107433/article/details/103537437