Winsock connect() висит на одной сети, а не на другой

У меня проблемы с использованием функции connect(). Мой код раньше полностью работал, но теперь я перешел в другую физическую сеть, и мой блокирующий вызов connect() больше не работает, а просто зависает на неопределенное время. Прием трансляций по UDP все еще работает нормально. Возвращаясь к старой сети, она снова работает нормально. Я не могу на всю жизнь понять, почему он работает в одной сети, а не в другой. Я проверил настройки брандмауэра, и они верны. Что может происходить?

У меня используется заранее определенный порт, и я получаю адрес из широковещательной рассылки. Я использую recievefrom для приема трансляции и установки с нее исходящего 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;`

1 ответ

Решение

Я обнаружил, что это проблема виртуальных сетевых устройств VMWare. Несмотря на то, что у меня не было запущенных виртуальных машин, после долгих испытаний различных вещей я обнаружил, что вещание устройства каким-то образом принималось на одном из виртуальных сетевых интерфейсов от VMWare. Отключение этих двух устройств решило эту проблему.

Другие вопросы по тегам