我正在努力为Rock Paper Scissors协议实现服务器。到目前为止,一切进展顺利,除了我要克服的障碍。作为该程序的总体概述:


客户端连接到服务器。
第二个客户端连接到服务器。
服务器从客户端1接收输入。
服务器从客户端2接收输入。
服务器确定获胜者,然后将获胜信息发送回每个客户。


我将套接字包装在一个类中,以允许使用更简单的API来使用它们。我遇到问题的部分在这里:

  char playerOneRequest;
  char playerTwoRequest;
  int playerOneLength = mPlayerOne->receive(&playerOneRequest,
                                            BUFFER_SIZE);
  cerr << "After player one\n";
  cout << "Received '" << playerOneRequest << "' from player one.\n";
  int playerTwoLength = mPlayerTwo->receive(&playerTwoRequest,
                                            BUFFER_SIZE);
  cerr << "After player two\n";
  cerr << "Received '" << playerTwoRequest << "' from player two.\n";

  char playerOne = toupper(playerOneRequest);
  char playerTwo = toupper(playerTwoRequest);


我一直在使用DDD对其进行调试,但发现了一个问题。假设一位玩家发送了R,而两位玩家发送了S。在第一次接收之后,playerOneRequest是R,在第二次接收之后是第二个玩家(单独的TCP流),playerTwoRequest是S。但此时,playerOneRequest现在等于\r

我不知道为什么会这样。我的所有代码都可以在this Gist中找到

最佳答案

BUFFER_SIZE是什么值?您在playerOneRequest中只能容纳一个字符,但是看来您可能从接收中读取多个字符。读取的所有其他字符将放入相邻变量中。

10-06 14:44