使用 Winsock 实现简单的 UDP 服务器和客户端

使用 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 编程。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值