2012-04-25 2 views
2

何が起こっているのか分かりません。 localhost( "localhost"、 "127.0.0.1"またはマシンの外部IPのいずれか)以外の場所にソケットを作成した場合、正常に動作します。 私はそのポートで何かを聞くことなく、私は10060(タイムアウト)を取得するが、意味がある10061を取得することなく、アドレスへのソケットを作成する場合。なぜ私はlocalhostに行くときに接続が拒否されているのですか? ファイアウォールを無効にしようとしましたが、それは問題ではありませんでしたが、それはそうではありません。Winsockはローカルホストにのみ接続すると10061を返します

私はこの前にすべてのWSA初期化を行っています。

_socketToServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if(_socketToServer == -1){ 
    return false; 
    } 

    p_int = (int*)malloc(sizeof(int)); 
    *p_int = 1; 
    if((setsockopt(_socketToServer, SOL_SOCKET, SO_REUSEADDR, 
     (char*)p_int, sizeof(int)) == -1)|| 
     (setsockopt(_socketToServer, SOL_SOCKET, SO_KEEPALIVE, (char*)p_int, 
       sizeof(int)) == -1)){ 
     free(p_int); 
     return false; 
    } 
    free(p_int); 


    struct sockaddr_in my_addr; 

    my_addr.sin_family = AF_INET ; 
    my_addr.sin_port = htons(_serverPort); 

    memset(&(my_addr.sin_zero), 0, 8); 
    my_addr.sin_addr.s_addr = inet_addr(_serverIP); 


    if(connect(_socketToServer, (struct sockaddr*)&my_addr, sizeof(my_addr)) 
     == SOCKET_ERROR){ 
    DWORD error = GetLastError(); //here is where I get the 10061 
    return false; 
} 

+0

ファイアウォールやマルウェア対策のようなものです。あなたは実際にポートでリッスンしているプログラムを実行していますか? –

+0

ポート番号は何ですか?あなたは10060を受け取るか、実際に接続したいと思いますか? – marcinj

+0

私は9001,9002 ... 9033を試しました。彼らのどれも働かなかった。 私は聞いているプログラムを持っていますが、私は同じ結果を得ていません。 リモートクライアントから動作します。実際にテストするだけで、同じマシン内からパテを介してポートを開こうとしましたが、接続を開始できます! (サーバーコードは自動的にデータを送信し、端末に表示されているデータを自動的に送信します)。私は非常に混乱しています – cloudraven

答えて

4

他のマシンの非リスニングポートに接続するときに、WSAETIMEDOUTエラーが発生することは保証されません。任意の数の異なるエラーが発生する可能性があります。しかし、通常WSAETIMEDOUTエラーは、connect()がタイムアウトする前にソケットがネットワーク上のターゲットマシンに到達できない場合にのみ発生します。ターゲットマシンに到達できる場合、WSAECONNREFUSEDエラーは、ターゲットマシンがconnect()リクエストを認識していることを意味し、要求されたポートがリスンしていないか、バックログがいっぱいであるため、その時点で接続を受け入れることができないと返信していますどのように区別することはできません)。したがって、ローカルホストに接続しているときは、同じマシンに接続しているためポートのリスニングステータスを決定するのに遅延がないため、リスンしていないポートに接続すると、ほとんど常にWSAECONNREFUSEDエラーが発生します。ファイアウォールやマルウェア対策とは関係ありません。これは正常な動作です。

+0

ありがとう。実際にそれを知ることは非常に便利です。ポートに関係なく同じエラーメッセージが表示されていたので、私は混乱していました。 最後に、再起動すると問題が解決しました。私は本当に近いサーバーソケットdidntを推測する。私は早くそれを試していたはずです。 – cloudraven

+2

バックログがいっぱいになると、WindowsサーバだけがECONN/WSAECONNREFUSEDを引き起こします。 UnixおよびLinuxサーバーはタイムアウトを引き起こします。 – EJP

関連する問題