1

我编写了一个非常简单的 C++ 服务器,我从 Java 应用程序连接到它。C++ 服务器使用winsock2。我正在从我的客户端向服务器发送 UTF8 编码的数字,并且在收到这些数字后,我希望服务器执行一个操作。但是,我的服务器似乎正在接收一系列数字。目前,我让服务器每 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 客户端代码,用于在 out 处发送消息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 个数字,它永远不会再开始只接收一个。这是我的 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() does not block。您需要检查返回值中的错误。

于 2012-09-08T18:01:40.660 回答