我们的软件在连接到 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/