2

何が起こっているのかわかりません。localhost 以外の場所 (「localhost」、「127.0.0.1」、またはマシンの外部 IP) にソケットを作成すると、正常に動作します。そのポートで何かをリッスンせずにアドレスへのソケットを作成すると、10060 (タイムアウト) が返されますが、意味のある 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;
}

何か案は?

4

1 に答える 1

4

WSAETIMEDOUT別のマシンのリッスンしていないポートに接続すると、エラーが発生する保証はありません。さまざまなエラーが発生する可能性があります。ただし、WSAETIMEDOUT通常、タイムアウトになる前にソケットがネットワーク上のターゲット マシンに到達できない場合にのみ、エラーが発生connect()します。ターゲット マシンに到達できる場合、WSAECONNREFUSEDエラーは、ターゲット マシンがconnect()要求を確認しており、リッスンしていないか、バックログがいっぱいであるため、要求されたポートがその時点で接続を受け入れることができないという応答を返していることを意味します。どちらかを区別する方法はありません)。そのため、ローカルホストに接続しているときは、ほとんどの場合、WSAECONNREFUSED同じマシンに接続しており、ポートのリッスン状態を判断する際に遅延がないため、リッスンしていないポートに接続するとエラーが発生します。ファイアウォールやマルウェア対策とは何の関係もありません。これは正常な動作です。

于 2012-04-25T01:49:07.197 に答える