Не могу подключиться к удаленному ip

Я пытаюсь подключить клиент к серверу. С локальным адресом (127.0.0.1) все работает отлично, но когда я пытаюсь использовать свой удаленный адрес, это не работает. Искал эту штуку по всему интернету, но ничего не нашел.

Сторона сервера:

bool start_server()
{
    int i = 1;
    if(WSAStartup(MAKEWORD(2,0),&WsaDat) != 0)
    {
         cout << "WSA error!" << endl;
         system("pause");
         return FALSE;
    }
    if ( LOBYTE( WsaDat.wVersion ) != 2 || HIBYTE( WsaDat.wVersion ) != 0 )
    {
      cout << "Bad version of winsocket" << endl;
      system("pause");
      WSACleanup();
      return 0;
    }



    serwer = socket(AF_INET, SOCK_STREAM, 0);
    if(serwer == INVALID_SOCKET)
    {
        cout << "Can't create socketa!" << endl;
        system("pause");
        WSACleanup();
        return 0;
    }
    int port;
    cout << "Port input " << endl;
    cin >> port;                                             // 13056
    SOCKADDR_IN SockAddr;
    SockAddr.sin_port =  htons(port);
    SockAddr.sin_family = AF_INET;
    SockAddr.sin_addr.s_addr = INADDR_ANY;
    setsockopt( serwer, SOL_SOCKET, SO_REUSEADDR, ( char * ) &i, sizeof ( i ) );
    if(bind(serwer,(SOCKADDR *)(&SockAddr), sizeof(SockAddr)) == SOCKET_ERROR)
    {
        cout << "Couldn't bind socket" << endl;
        system("pause");
        WSACleanup();
        return 0;
    }
    for(int i = 0; i < MAX_CLIENTS; i++)
    client[i].connected = FALSE;
    if(listen(serwer,SOMAXCONN)==SOCKET_ERROR)
    {
        cout << "Listening error!" << endl;
        system("pause");
        WSACleanup();
        return 0;
    }
    cout << "Serwer created!" << endl;
    unsigned long b = 0;
    ioctlsocket ( serwer, FIONBIO, &b );
    return 1;
}

После этого у меня есть функция приема, на которой программа блокируется:

accept(serwer,(SOCKADDR *)(&current_client->address),&current_client->address_length);

Сторона клиента:

bool start_client()
{
    WSADATA WsaDat;

    if(WSAStartup(MAKEWORD(2,0),&WsaDat) != 0)
        cout << "WSA error!\n";
    if ( LOBYTE( WsaDat.wVersion ) != 2 || HIBYTE( WsaDat.wVersion ) != 0 )
    {
        cout << "Wrong version of winsocket\n";
        WSACleanup();
                    return false;
    }

    SOCKET Klient;

    Klient = socket(AF_INET, SOCK_STREAM, 0);
    if(Klient == INVALID_SOCKET)
            {
        cout << "Can't create socket socketa!\n";
        WSACleanup();
                    return false;
    }
    SOCKADDR_IN SockAddr;
    SockAddr.sin_port = htons(PORT);                        // 13056
    SockAddr.sin_family = AF_INET;
    SockAddr.sin_addr.S_un.S_addr = inet_addr("*********");      // my remote address
    while(connect(Klient, (SOCKADDR *)(&SockAddr), sizeof(SockAddr)) != 0) 
    {
        cout << "Trying to connect " << WSAGetLastError() << "\n";
        Sleep(500);
    }
    cout << "Connected!\n";
}

Я добавил как клиентские, так и серверные приложения в правила брандмауэра, а также попытался подключить их к паре портов. Серверная сторона точно слушает (здесь на другом порту):

введите здесь описание изображения


person Blood    schedule 02.05.2013    source источник
comment
Попробуйте удалить части, которые не являются абсолютно необходимыми: файлы SO_REUSEADDR и FIONBIO. Тогда к какому удаленному адресу вы подключаетесь? Те, которые должны работать, - это IP-адреса, прикрепленные к вашим локальным сетевым адаптерам, см. вывод, например. ipconfig. Кроме того, вы можете попытаться подключиться к какой-либо машине (например, веб-серверу) в Интернете, по крайней мере, вы сможете установить соединение.   -  person Ulrich Eckhardt    schedule 02.05.2013
comment
Какой код ошибки возвращает WSAGetLastError() при сбое connect()?   -  person Remy Lebeau    schedule 03.05.2013
comment
@Remy Lebeau - 10060 - Время ожидания соединения   -  person Blood    schedule 03.05.2013
comment
@думстер - это не то. 127.0.0.1 и 192.168.0.10 (мои локальные адреса) работают. Когда я пытаюсь сделать это с моим IP-адресом, проверенным на whatsmyip.org, это не работает :(   -  person Blood    schedule 03.05.2013
comment
@Blood: ваш интернет-модем подключен напрямую к компьютеру или к сетевому маршрутизатору? Если последнее, то вам необходимо настроить маршрутизатор для переадресации входящих подключений к ПК, на котором запущено ваше серверное приложение.   -  person Remy Lebeau    schedule 03.05.2013


Ответы (1)


В вашем коде нет ничего плохого.

Не все маршрутизаторы и трансляторы сетевых адресов (NAT) поддерживают закрепление, это возможность подключиться к вашему общедоступному IP-адресу из частной сети за NAT.

Если ваш NAT/маршрутизатор поддерживает это, вам, вероятно, потребуется настроить правило переадресации портов на NAT/маршруте, чтобы сопоставить весь входящий TCP-трафик через порт 14354 (порт прослушивания вашего сервера) с внутренним IP-адресом 192.168.0.10. . Подумайте об этом с точки зрения маршрутизатора: если он видит входящий запрос на подключение по общедоступному IP-адресу, ему необходимо знать, на какой хост в частной сети перенаправить это подключение.

person selbie    schedule 03.05.2013