VC++ 实现的 TCP Socket 客户端与服务端示例

季宁
季宁
发布时间:2026-10-14 | 4人浏览过
原创

本文分享基于 Windows 平台的 VC++ (C++) TCP Socket 网络通信实例。通过 WinSock2.h 标准库,分别给出服务端(Server)监听接收数据与客户端(Client)发起请求的完整源代码,涵盖从库初始化、套接字创建到断开连接的全过程。

TCP 服务端核心逻辑

服务端程序主要任务是创建一个监听套接字,绑定特定端口(本例为 6000),并持续接受来自客户端的连接请求。以下是完整的 Tcp Server 代码实现:

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

#pragma comment(lib, "ws2_32.lib")

int main()
{
    // 1. 初始化 Windows Sockets DLL
    WORD wVerisonRequested;
    WSADATA wsaData;
    int err;
    wVerisonRequested = MAKEWORD(1, 1);
    err = WSAStartup(wVerisonRequested, &wsaData);
    if (err != 0)
    {
        return -1;
    }

    // 2. 创建流式套接字 (TCP)
    SOCKET sockServer = socket(AF_INET, SOCK_STREAM, 0);

    // 3. 绑定地址信息
    SOCKADDR_IN addrServer;
    addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); 
    addrServer.sin_family = AF_INET;
    addrServer.sin_port = htons(6000); // 监听端口 6000
    bind(sockServer, (SOCKADDR *)&addrServer, sizeof(addrServer));

    // 4. 进入监听状态,等待连接
    listen(sockServer, 5);

    SOCKADDR_IN addrClient;
    int len = sizeof(addrClient);
    while(1)
    {
        // 5. 接受客户端连接
        SOCKET sockConnection = accept(sockServer, (SOCKADDR *)&addrClient, &len);

        // 6. 向客户端发送欢迎消息
        char sendBuf[100];
        sprintf(sendBuf, "Welcome %s", inet_ntoa(addrClient.sin_addr));
        send(sockConnection, sendBuf, strlen(sendBuf)+1,0);

        // 7. 接收客户端数据
        char recvBuf[100];
        recv(sockConnection, recvBuf, 100, 0);
        printf("%s", recvBuf);

        // 8. 关闭当前连接,准备接受下一个
        closesocket(sockConnection);
    }
}

第1步:环境初始化与版本检查

目的:确保系统已加载必要的网络库功能。
动作调用 WSAStartup 函数,指定所需的 Winsock 版本(此处为 MAKEWORD(1, 1))。
参数:&wsaData 用于接收加载的库实际版本信息。
注意:必须包含头文件 #include <WinSock2.h> 并在编译时链接 ws2_32.lib(使用 #pragma comment(lib, "ws2_32.lib"))。

第2步:绑定服务端口

目的:将套接字绑定到特定的 IP 和端口上。
动作配置 SOCKADDR_IN 结构体。
关键参数:sin_port 设为 htons(6000),表示服务器在本地 6000 端口提供服务;INADDR_ANY 表示接受来自任何网卡接口的连接。

第3步:循环处理连接

目的:处理多个客户端的数据交互。
动作:通过 accept 阻塞等待新连接;连接建立后,使用 send 和 recv 进行数据收发;最后通过 closesocket 释放该连接的资源。

TCP 客户端核心逻辑

客户端程序负责连接到指定的服务器地址和端口,发送请求数据并读取服务器的响应。以下是 Tcp Client 代码实现:

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

#pragma comment(lib, "ws2_32.lib")

int main()
{
    // 1. 初始化 Winsock 库
    WORD wVerisonRequested;
    WSADATA wsaData;
    int err;
    wVerisonRequested = MAKEWORD(1, 1);
    err = WSAStartup(wVerisonRequested, &wsaData);
    if (err != 0)
    {
        return -1;
    }

    // 2. 创建客户端套接字
    SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);

    // 3. 连接服务器
    SOCKADDR_IN addrServer;
    addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); // 连接本地回环地址
    addrServer.sin_family = AF_INET;
    addrServer.sin_port = htons(6000); // 对应服务器端口
    connect(sockClient, (SOCKADDR *)&addrServer, sizeof(addrServer));

    // 4. 接收服务器发来的数据
    char recvBuf[100];
    recv(sockClient, recvBuf, 100, 0);
    printf("%s", recvBuf);

    // 5. 向服务器发送数据
    char sendBuf[100] = "this is lisi\n";
    send(sockClient, sendBuf, strlen(sendBuf)+1,0);

    // 6. 关闭连接并清理资源
    closesocket(sockClient);
    WSACleanup();
}

第1步:建立连接通道

目的:发起与服务端的握手。
动作:填充目标服务器地址结构,重点在于 IP inet_addr("127.0.0.1") 和端口 htons(6000) 必须与服务器保持一致。
完成判断:connect 函数返回非错误值时表示链路已通。

第2步:数据交换与退出

目的:完成一次请求-响应交互。
动作先调用 recv 获取服务器欢迎语,再调用 send 发送用户标识字符串。
风险提醒:客户端结束后必须调用 WSACleanup() 以卸载 Winsock 动态链接库,否则可能导致后续其他应用的网络异常。

运行与排错指南

要成功测试上述代码,请按以下顺序操作:

  1. 编译:确保编译器支持 Win32 API,并已正确链接 ws2_32.lib 库。
  2. 启动服务端:首先运行 Tcp Server 程序,观察控制台是否无报错输出(它处于 listen 状态)。
  3. 启动客户端:在同一台机器上运行 Tcp Client 程序。
  4. 观察结果:服务端控制台应打印出 "Welcome 127.0.0.1" 后跟随客户端发送的内容;客户端控制台应打印 "Welcome 127.0.0.1" 并自动退出。

若出现连接失败或超时,请检查防火墙设置是否允许 6000 端口的入站流量,或确认服务端代码中绑定的 IP/Port 与客户端一致。

以上就是 C++ 基于 WinSock2 实现 TCP Socket 客户端和服务端的详细内容,更多关于 C++ 网络编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表