You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Socket跨网络通信遇10060错误求助(附完整代码)

Socket跨网络连接超时(10060)问题排查与修复

核心问题分析

  1. 服务端IP校验逻辑阻塞连接
    服务端硬编码了固定IP校验规则ClientIndex = "123.456.789.123",仅允许该IP的客户端连接。跨网络场景下客户端公网IP必然与该值不符,导致服务端接受连接后直接丢弃,客户端因长时间无响应触发10060超时错误。此外这段代码还存在内存泄漏(malloc分配的内存未释放就被字符串常量覆盖)。

  2. 错误处理缺失
    服务端的socket、bind、listen调用未检查返回值,客户端使用GetLastError而非WinSock专用的WSAGetLastError获取错误码,这些都可能隐藏潜在问题。

  3. 网络端口映射未配置
    若服务端位于NAT网络(如家庭路由器后),仅设置Windows防火墙入站规则不足以让公网客户端访问,必须在路由器上配置端口映射,将公网端口10168转发到服务端内网IP的对应端口。

修复步骤与代码修改

服务端代码修复

移除硬编码IP校验,补充错误处理逻辑:

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32")

#define PORT 10168
#define PACKET_SIZE 1024

using namespace std;

void ConnectSocket();

SOCKET hc = NULL;
SOCKET hListen;
SOCKADDR_IN tListenAddr = {};

int main()
{
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        cout << "WSAStartup失败: " << WSAGetLastError() << endl;
        return 1;
    }

    hListen = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (hListen == INVALID_SOCKET)
    {
        cout << "创建socket失败: " << WSAGetLastError() << endl;
        WSACleanup();
        return 1;
    }

    tListenAddr.sin_family = AF_INET;
    tListenAddr.sin_port = htons(PORT);
    tListenAddr.sin_addr.s_addr = htonl(INADDR_ANY);

    if (bind(hListen, (SOCKADDR*)&tListenAddr, sizeof(tListenAddr)) == SOCKET_ERROR)
    {
        cout << "绑定端口失败: " << WSAGetLastError() << endl;
        closesocket(hListen);
        WSACleanup();
        return 1;
    }

    if (listen(hListen, 20) == SOCKET_ERROR)
    {
        cout << "监听端口失败: " << WSAGetLastError() << endl;
        closesocket(hListen);
        WSACleanup();
        return 1;
    }

    cout << "服务端正在监听端口 " << PORT << endl;

    for (;;)
    {
        ConnectSocket();

        if (hc != NULL)
        {   
            cout << "客户端连接成功" << endl;
            break;
        }
        Sleep(200);
    }

    // 后续可添加数据收发逻辑

    closesocket(hc);
    closesocket(hListen);
    WSACleanup();
    return 0;
}

void ConnectSocket()
{
    SOCKADDR_IN tCIntAddr = {};
    int iCIntSize = sizeof(tCIntAddr);
    SOCKET hclient = accept(hListen, (SOCKADDR*)&tCIntAddr, &iCIntSize);

    if (hclient == INVALID_SOCKET)
    {
        cout << "接受连接失败: " << WSAGetLastError() << endl;
        return;
    }

    cout << "收到来自 " << inet_ntoa(tCIntAddr.sin_addr) << " 的连接" << endl;
    hc = hclient;
}

客户端代码修复

替换错误码获取函数,改用标准IP处理函数,补充错误处理:

#include "stdio.h"
#include <iostream>
#include <WinSock2.h>
#include "windows.h"
#include <ws2tcpip.h>

#pragma comment(lib,"ws2_32")

#define PORT 10168
#define PACKET_SIZE 1024
#define SERVER_IP "替换为服务端实际公网IP"

using namespace std;

int main()
{
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        cout << "WSAStartup失败: " << WSAGetLastError() << endl;
        return 1;
    }

    SOCKET hSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (hSocket == INVALID_SOCKET)
    {
        cout << "创建socket失败: " << WSAGetLastError() << endl;
        WSACleanup();
        return 1;
    }

    SOCKADDR_IN tAddr = {};
    tAddr.sin_family = AF_INET;
    tAddr.sin_port = htons(PORT);
    if (inet_pton(AF_INET, SERVER_IP, &tAddr.sin_addr) <= 0)
    {
        cout << "服务端IP地址无效" << endl;
        closesocket(hSocket);
        WSACleanup();
        return 1;
    }

    if (connect(hSocket, (sockaddr*)&tAddr, sizeof(tAddr)) == SOCKET_ERROR)
    {
        cout << "连接失败 : " << WSAGetLastError() << endl;
        closesocket(hSocket);
        WSACleanup();
        return 1;
    }

    cout << "成功连接到服务端" << endl;

    // 后续可添加数据收发逻辑

    closesocket(hSocket);
    WSACleanup();
    return 0;
}

网络层面排查要点

  • 端口映射配置:登录服务端所在路由器,添加端口映射规则,将公网端口10168映射到服务端内网IP的10168端口。
  • 防火墙检查:确认服务端Windows防火墙、杀毒软件防火墙均已允许程序访问10168端口,或临时关闭防火墙测试。
  • 公网IP验证:通过curl ifconfig.me或IP查询网站确认服务端公网IP,客户端必须使用该IP连接。
  • 端口可用性:部分运营商会屏蔽非常用端口,可尝试更换为8080、80等常用端口测试。

内容的提问来源于stack exchange,提问作者MX-4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:45:40