2

これについて新しい質問を始めると思いました。私はTCPサーバー/クライアントをセットアップしており、それらは通常私が望む方法で通信します。1 サーバーと 1 クライアント。

私が今やりたいことは、接続が失われたときにクライアントがサーバーに自動的に再接続できるようにする機能を追加することです。これを行う方法に関する完全な情報をオンラインで見つけるのに苦労しています。これは(うまくいけば)関連する問題コードです:

サーバ:

    case FD_ACCEPT: //Connection request  
    {  
        SOCKET TempSock = accept(s, (struct sockaddr*)&fromm, &fromlenn);  
        s = TempSock; //Switch old socket to the new one  
        m_sNetworkStatus.Format("[%s] accepted.", inet_ntoa(fromm.sin_addr));  
        m_hNetworkStatus.SetWindowTextA(m_sNetworkStatus);  
    }  

最初のクライアント接続は正常に行われます。サーバーはリッスンし、クライアントは接続し、クライアントは切断します...しかし、クライアント 2回目に接続を試みたとき、結果のクライアントIPアドレス(サーバーから見たもの)は、印刷inet_ntoa(fromm.sin_addr))が出力するようなもの[0,0,0,0]です. そのため、クライアントは接続されていると「考え」ますが、そうではなく、サーバーは接続を受け入れたがデータを送信できないことを出力します...クライアント側で切断して再接続を試みると、

接続が拒否されました 10061 エラー。

(サーバー側から切断して新しいポートをリッスンしても問題ありません)

ありがとう !!!

4

1 に答える 1

1

リッスンしているサーバー ソケット sを の結果accept()、つまり接続されたソケットで上書きしています。これは完全に間違っています - へlisten()の後続のすべての呼び出しで呼び出した同じサーバーソケットを再利用することになっています。これにより、クライアントからの完全な新しい TCP 接続を表すたびに新しいaccept()ソケットが提供されます。

于 2012-07-15T23:49:53.033 に答える