使用 Winsock 实现简单的 UDP 服务器和客户端
在本篇教程中,我们将探讨如何使用 Windows Sockets API(Winsock)在 Windows 平台上实现简单的 UDP 服务器和客户端。UDP(User Datagram Protocol)是一种无连接的传输协议,适用于那些需要快速传输数据但对数据可靠性要求不高的场景。通过以下两个示例代码,我们将详细说明如何设置和使用 UDP 套接字,并在服务器和客户端之间发送和接收数据。
UDP 服务器端代码解析
首先,让我们来看一下 UDP 服务器端的实现:
// 包含必要的头文件和库
#include <WinSock2.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main()
{
// 初始化套接字库
WORD mVersion;
WSADATA wsaData;
int err;
mVersion = MAKEWORD(1, 1);
err = WSAStartup(mVersion, &wsaData);
if (err != 0)
{
return err;
}
if (LOBYTE(mVersion, wsaData) != 1 || HIBYTE(mVersion, wsaData) != 1)
{
WSACleanup();
return -1;
}
// 创建 UDP 套接字
SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6002);
// 绑定套接字
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
// 接收请求,处理请求
SOCKADDR_IN addrCli;
int len = sizeof(SOCKADDR);
char sendBuf[] = "UDP Server...";
char recvBuf[100];
cout << "UDP 服务器已启动,监听端口 6002" << endl;
while (true)
{
// 接收数据
recvfrom(sockSrv, recvBuf, 100, 0, (SOCKADDR*)&addrCli, &len);
cout << "接收到客户端消息:" << recvBuf << endl;
// 发送数据
sendto(sockSrv, sendBuf, strlen(sendBuf) + 1, 0, (SOCKADDR*)&addrCli, len);
}
// 关闭套接字并清理库
closesocket(sockSrv);
WSACleanup();
return 0;
}
UDP 客户端端代码解析
接下来,让我们来看一下 UDP 客户端的实现:
// 包含必要的头文件和库
#include <WinSock2.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main()
{
// 初始化套接字库
WORD mVersion;
WSADATA wsaData;
int err;
mVersion = MAKEWORD(1, 1);
err = WSAStartup(mVersion, &wsaData);
if (err != 0)
{
return err;
}
if (LOBYTE(mVersion, wsaData) != 1 || HIBYTE(mVersion, wsaData) != 1)
{
WSACleanup();
return -1;
}
// 创建 UDP 套接字
SOCKET sockCli = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); // 服务器 IP 地址
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6002); // 服务器端口
SOCKADDR_IN addrCli;
int len = sizeof(SOCKADDR);
char sendBuf[] = "来自 UDP 客户端的消息...";
char recvBuf[100];
// 发送数据到服务器
sendto(sockCli, sendBuf, strlen(sendBuf) + 1, 0, (SOCKADDR*)&addrSrv, len);
// 接收服务器发送的数据
recvfrom(sockCli, recvBuf, 100, 0, (SOCKADDR*)&addrCli, &len);
cout << "接收到服务器消息:" << recvBuf << endl;
// 关闭套接字并清理库
closesocket(sockCli);
WSACleanup();
return 0;
}
教程总结
通过本教程,我们学习了如何使用 Winsock API 在 Windows 平台上实现简单的 UDP 服务器和客户端。在服务器端,我们创建了一个 UDP 套接字并将其绑定到指定端口,然后通过循环接收和发送数据。在客户端,我们创建了一个 UDP 套接字,并将其配置为发送数据到服务器的指定地址和端口,然后接收服务器的响应。希望这篇教程能够帮助您开始使用 Winsock 进行 UDP 编程。