C ++ TCP Winsock Server, получающий один и тот же пакет много раз

Я написал очень простой сервер 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-клиента, чтобы отправить сообщение, где находится 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-коде, где что-либо отправляется на сервер, и я очищаю буфер после каждого сообщения, так что я думаю, что проблема на моем сервере, но я в растерянности относительно этой проблемы.

Любая помощь приветствуется.

Благодарю.

1

Решение

Вы забыли самый важный чек:

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

Это может быть причиной того, что ваш цикл занял так много процессорного времени.

3

Другие решения

Учитывая сна, кажется, что recv не блокирует .. Посмотрите на Winsock recv () не блокирует. Вам необходимо проверить наличие ошибок в возвращаемом значении.

0

По вопросам рекламы [email protected]