2016-03-30 9 views
0

クライアントがまだサーバーに接続されているかどうかをソケットを使ってチェックします。私はrevc関数がクライアントの状態を私に与えているのを見ましたが、クライアントが切断せず、revc関数が自分のことを思っていたので、期待通りに動作していません。クライアントがまだ接続されているかどうかを確認する方法C++

if (recv(client->getSocket(), rcmsg, 1024, 0) <= 0) 
    { 
     bool found = false; 
     for (i = 0; i < this->clients.size(); i++) 
     { 
      if (*(this->clients[i]) == *client) 
      { 
       found = true; 
       break; 
      } 
     } 
     if (found) 
      this->clients.erase(this->clients.begin() + i); 
     closesocket(client->getSocket()); 
     std::cout << "disconected: socket = " << client->getSocket() << ", ip = " << inet_ntoa(addr.sin_addr) << endl; 

別のソリューションがあります: 私はこのコードを得ましたか。 ありがとうございます。

+0

あなたのクライアントを特定する唯一の方法は、依然として応答しなければならない「そこにいる」要求を含むサーバーとクライアントの間に要求 - 応答プロトコルを実装することです。他の方法は結果があまり正確ではありません。 – mah

+0

@mahそれは確かに方法ですが、唯一の方法ではありません。 – EJP

+0

@EJPには、間違った報告の対象にならない他の方法がありますか? – mah

答えて

0

TCP/IPがどこから来たのかを覚えておくことが重要です。

これは、全面的な核戦争に耐えるように設計された通信プロトコルスタックです。

これは電信柱が蒸気化されていることを意味し、無線リンクが断続的であるか、もはやそこに存在しないため、電話交換はもはや存在しません。

このコンテキストでは、 "connected"を定義します。

TCP「接続」は、接続されていると信じている2つの異なるホストに過ぎず、ネットワーク上の残りのルータによってパケットがホストにルーティングされます。

これは、私たちが決して考えていないプロトコルのホスト全体が存在する理由です。例えば、RIP(Routing Information Protocol)は、砲撃後に残りのリンクを発見することです。

実際には「接続済み」というものはありません。リモートホストからパケットを受信して​​からの経過時間です。それでおしまい。

関連する問題