1

Javaアプリケーションから接続する非常に単純なC++サーバーを作成しました。C++サーバーはwinsock2を使用します。UTF8でエンコードされた番号をクライアントからサーバーに送信しています。これらの番号を受信したら、サーバーにアクションを実行してもらいます。しかし、私のサーバーは一連の番号を1つとして受信しているようです。現在、サーバーは1ミリ秒ごとに新しいメッセージをリッスンしています。

これは、メッセージを受信する私のC++サーバーコードです。

  bool receive()
     {
          char buffer[1024];
          int inDataLength=recv(Socket,buffer,sizeof(buffer),0);
          if(buffer[0] != '\0')
          {
                     std::cout<<"Client: ";
                     std::cout << buffer;
                     sendKey(string(buffer));  
          }
          else if (inDataLength == 0) //Properly closed connection
          {
             std::cout<<"Connection lost..\r\n";
             return false;
          }    
          return true;
     }

これは、次のようにループ内で呼び出されます。

 while ( receive() )
{
      Sleep(1);
}

これは、メッセージを送信するためのJavaクライアントコードです。OutputStream = socket.getOutputStream():

public void send(String msg)
{
        try {
            out.write( msg.getBytes("UTF8") );
            out.flush();
            Thread.sleep(100);
        } catch (SocketException e) {
            Global.error("Connection error..");
            //e.printStackTrace();
        } catch (UnsupportedEncodingException e) {

        } catch (IOException e) {
            Global.error("Never connected..\r\n");
        } catch (Exception e)
        { Global.error("Sending failed..\r\n"); }
    }

私が得ているのは、たとえば1、2、12、121などの番号を特定のパターンで受信しているサーバーです。ただし、サーバーが一度に2つの番号を受信すると、1つだけを受信し始めることはありません。これは私のJavaコードでサーバーに何かが送信される唯一の場所であり、各メッセージの後にバッファーをフラッシュするので、問題はサーバーにあると思いますが、問題については途方に暮れています。

どんな助けでも大歓迎です。

ありがとう。

4

2 に答える 2

3

あなたは最も重要なチェックを忘れています:

int inDataLength=recv(Socket,buffer,sizeof(buffer),0);
if (inDataLength == -1 ) {
    std::cerr << "receive error: " << GetLastError() << std::endl;
    return false;
}
...

これが実際には、ループに非常に多くのCPU時間がかかった理由である可能性があります。

于 2012-09-09T01:12:41.883 に答える
0

スリープ状態を考えると、recvはブロックされていないようです。Winsockを見てください。recv()はブロックされていません。戻り値のエラーをチェックする必要があります。

于 2012-09-08T18:01:40.660 に答える