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

C++ Winsock connect()挂在一个网络上,但不挂在另一个网络上,c++,winsock,connect,C++,Winsock,Connect,我在使用connect()函数时遇到问题。我的代码以前完全可以工作,但现在我已经转移到另一个物理网络,对connect()的阻塞调用不再工作,而且似乎无限期地挂起。通过UDP接收广播仍然可以正常工作。回到旧网络,它又能正常工作了。我一辈子都搞不懂为什么它在一个网络上工作而在另一个网络上不工作。我已经检查了防火墙设置,它们是正确的。会发生什么事 我有一个预定义的端口正在使用,我正在从广播中获取地址。我使用ReceiveFrom接收广播并设置广播的传出ip地址 ret=recvfrom(bcast、

我在使用connect()函数时遇到问题。我的代码以前完全可以工作,但现在我已经转移到另一个物理网络,对connect()的阻塞调用不再工作,而且似乎无限期地挂起。通过UDP接收广播仍然可以正常工作。回到旧网络,它又能正常工作了。我一辈子都搞不懂为什么它在一个网络上工作而在另一个网络上不工作。我已经检查了防火墙设置,它们是正确的。会发生什么事

我有一个预定义的端口正在使用,我正在从广播中获取地址。我使用ReceiveFrom接收广播并设置广播的传出ip地址
ret=recvfrom(bcast、bcast\u read、sizeof(j4cDAC\u广播)、0(sockaddr*)和from、以及size)

to.sin\u addr=from.sin\u 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;`
dac=socket(AF\u INET、SOCK\u STREAM、IPPROTO\u TCP);

//cout我发现这是VMWare虚拟网络设备的一个问题。尽管我没有运行虚拟机,但在对各种事情进行了大量测试之后,我发现设备广播是在一个虚拟网络接口上以某种方式从VMWare接收的。禁用这两个设备已解决此问题。

这两个网络是什么样子的?您正在获取并尝试连接到哪个地址?您是否尝试过将tracert
发送到该地址?用wireshark查看数据包?如何声明“to”变量?将哪些参数传递给WSAStartup?什么Windows版本?Linux?
sockaddr\u进入;to.sin_family=AF_INET;to.sin_端口=htons((短)TCPport);to.sin_addr=from.sin_addr
WSAStartup(MAKEWORD(2,2),&wsd)
网络配置是windows 7 x64,它工作的网络由一个路由器组成,其中只有pc和要连接的设备。对于这个网络,我在两个以太网端口中的一个上有相同的设置,然后在另一个上有internet的另一个网络,两个网络设备在Windows中桥接。我不相信该设备会响应tracert,因为它的文档统计数据表明,它只在一个端口上侦听,使用wireshark,我甚至没有看到任何连接尝试您是否使用gethostbyname来检索正确的地址?