Winsock connect() 挂在一个网络上,但不在另一个网络上

问题描述 投票:0回答:1

我在使用 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;`
c++ sockets winsock
1个回答
0
投票

我发现这是 VMWare 虚拟网络设备的问题。尽管我没有运行虚拟机,但经过大量测试后,我发现设备广播正在从 VMWare 的虚拟网络接口之一上接收。禁用这两个设备已解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.