2011-01-03 2 views
0

По какой-то причине мое приложение чата всегда получает WSATIMEDOUT при попытке подключиться к другому человеку через Интернет.C++ connect() продолжает возвращать WSATIMEDOUT через Интернет, но не локально

int len_ip = GetWindowTextLength(GetDlgItem(hWnd,ID_EDIT_IP)); 
char ipBuffer[16]; 
SendMessage(GetDlgItem(hWnd,ID_EDIT_IP),WM_GETTEXT,16,(LPARAM)ipBuffer); 
long host_ip = inet_addr(ipBuffer); 




int initializeConnection(long host_ip, HWND hWnd) { 
    // initialize winsock 
    WSADATA wdata; 
    int result = WSAStartup(MAKEWORD(2,2),&wdata); 
    if (result != 0) { 
     return 0; 
    } 

    // setup socket 
    tcp_sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
    if (tcp_sock == INVALID_SOCKET) { 
     return 0; 
    } 

    // setup socket address 
    SOCKADDR_IN tcp_sock_addr; 
    tcp_sock_addr.sin_family = AF_INET; 
    tcp_sock_addr.sin_port = SERVER_TCP_PORT; 
    tcp_sock_addr.sin_addr.s_addr = host_ip; 

    // connect to server 
    if (connect(tcp_sock,(SOCKADDR*)&tcp_sock_addr,sizeof(tcp_sock_addr)) ==  SOCKET_ERROR) { 
     return 0; 
    } 
    HRESULT hr = WSAGetLastError(); 

    // set socket in asynchronous mode 
    if (WSAAsyncSelect(tcp_sock,hWnd,SOCKET_TCP, FD_READ | FD_WRITE | FD_CONNECT | FD_CLOSE) == SOCKET_ERROR) { 
     return 0; 
    } 

    return 1; 
} 

По какой-то причине он отлично работает в локальной сети между компьютерами, но полностью завинчивается через Интернет. WSATIMEDOUT всегда возвращается (не было отказано в соединении, поэтому проблема с портом не была). Это заставляет меня полагать, что что-то не так с IP, но почему он может работать по локальным адресам (например, 192.168.2.4)

Любые идеи?

Приветствия

+3

Вы уверены, что человек, с которым вы пытаетесь подключиться, не находится за брандмауэром, шлюзом NAT или иным образом недоступен? Простой способ проверить, является ли это ошибкой в ​​вашей программе или сети, - это просто telnet для этой комбинации хоста и порта. Если это тоже не удается, это связано с сетью. – nos

+0

Да, даже если бы это было так, я бы получил «отказ от связи» или похожий афайк. Сервер открыл порты маршрутизатора и включил программу через брандмауэр Windows. – KaiserJohaan

+0

@ KaiserJohaan Многие брандмауэры/маршруты просто отбрасывают пакеты, и вы получаете тайм-аут, а не «соединение отказано». Проконсультируйтесь с telnet. – nos

ответ

0

Это может быть брандмауэр, настроенный на удаление входящих запросов вместо их отказа. Иногда это называется режимом «скрытности».