c - connect() 因 WSAETIMEDOUT 失败后重用套接字?

标签 c windows sockets winapi windows-server-2012-r2

我们的软件在连接到 SIEMENS PLC 时出现问题。我们创建了一个套接字并不断对其进行 connect(),始终收到 WSAETIMEDOUT。在完全相同的 IP 和端口上远程登录到 PLC 是有效的。伪代码如下:

// Does not work
SOCKET reconnect(char* ip) {
    SOCKET sock = socket(PF_INET,SOCK_STREAM,0);
    struct sockaddr_in addr = make_addr();
    int err;

    while(1) {
        err = connect(sock,(struct sockaddr FAR*) &addr,sizeof(addr));
        if( err==SOCKET_ERROR ) {
            log()  // WSAETIMEDOUT logged here
            continue;
        }
        return sock;
    }
}

更改代码为每个 connect() 调用创建一个新套接字后,它似乎可以工作......

// Works
SOCKET reconnect(char* ip) {
    struct sockaddr_in addr = make_addr();
    int err;

    while(1) {
        SOCKET sock = socket(PF_INET,SOCK_STREAM,0);
        err = connect(sock,(struct sockaddr FAR*) &addr,sizeof(addr));
        if( err==SOCKET_ERROR ) {
            log()  // WSAETIMEDOUT logged here
            closesocket(sock);
            continue;
        }
        return sock;
    }
}

第一个代码片段已在多个 Windows 版本的生产环境中成功运行了大约 20 年。我怀疑它不符合规范...Windows Server 2012 R2(客户正在运行的)是否有任何更改/更新来改变此行为?

编辑

根据docs ,

If the error code returned indicates the connection attempt failed (that is, WSAECONNREFUSED, WSAENETUNREACH, WSAETIMEDOUT) the application can call connect again for the same socket.

...这使得这更加令人费解。

最佳答案

你的代码总是错误的。失败的 connect() 总是会损坏套接字。你很幸运,它工作了这么久。

关于c - connect() 因 WSAETIMEDOUT 失败后重用套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34041391/

相关文章:

c - 后台进程退出的速度快于我添加其 pid 进行管理的速度

java - 检测用 Java 读取的文件

c# - 从 SocketException 获取实际套接字

c - EPIPE block 服务器

Java HttpURLConnection 和池

c - HPC中的UPC-经验和建议

c - 在 C 中获取 float 的位表示

c - 段错误 - C 语言 - Struct 和 For 循环

c++ - 静态链接现有的 Windows 二进制文件

windows - 您可以将 Kinect for Xbox 用于 Kinect Fusion 吗?