我在使用 connect() 函数时遇到问题。我的代码以前完全可以工作,但现在我已经转移到不同的物理网络,并且对 connect() 的阻塞调用不再有效,并且似乎无限期地挂起。通过 UDP 接收广播仍然可以正常工作。回到旧网络,它又可以正常工作了。我一生都无法弄清楚为什么它在一个网络上有效,而在另一个网络上无效。我检查了防火墙设置,它们是正确的。可能发生什么事?
我有一个正在使用的预定义端口,并且我正在从广播中获取地址。我使用 receivefrom 接收广播并从中设置传出 IP 地址
ret = recvfrom (bcast, bcast_read,sizeof(j4cDAC_broadcast),0,(sockaddr*)&from,&size);
to.sin_addr = from.sin_addr;
local.sin_addr.s_addr = inet_addr("0.0.0.0");
然后对于 TCP 连接我有
dac = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// cout << "SOCKET\n";
if (dac == INVALID_SOCKET)
{
SetConsoleTextAttribute(console,(WORD)12);
cout << "TCP socket failed: " << WSAGetLastError();
connected_ = false;
return(1);
}
//set SO_REUSEADDR on a socket to true (1):
bool optval = true;
setsockopt(dac, SOL_SOCKET,SO_DONTLINGER,(const char*)&optval, sizeof(optval));
int pies = setsockopt(dac, SOL_SOCKET,SO_REUSEADDR,(const char*)&optval, sizeof(optval) );
if (pies == SOCKET_ERROR )
{
SetConsoleTextAttribute(console,(WORD)12);
cout << "SETSOCKOPT ERROR: " << WSAGetLastError() << endl;
} // */
local_T = local;
local_T.sin_port = htons ((short)TCPport);
//bind the tcp socket
bndt = bind(dac,(SOCKADDR*) &local_T,sizeof(local_T) );
if (bndt == SOCKET_ERROR )
{
SetConsoleTextAttribute(console,(WORD)12);
cout << "BIND TCP FAILED: " << WSAGetLastError();
if (WSAGetLastError() == WSAEACCES)
cout << "ACCESS DENIED";
cout << endl;
SetConsoleTextAttribute(console,(WORD)7);
shutdown(dac,2);
closesocket(dac);
connected_ = false;
return 1;
}
c = connect(dac, (sockaddr*) &to, size); // <------- This hangs
if (c == SOCKET_ERROR)
{
cout << "connection problem: " << WSAGetLastError() <<endl;
}
connected_ = true;`
我发现这是 VMWare 虚拟网络设备的问题。尽管我没有运行虚拟机,但经过大量测试后,我发现设备广播正在从 VMWare 的虚拟网络接口之一上接收。禁用这两个设备已解决此问题。