У меня есть программа C++/windows, которая получает данные из другой программы C++ через сообщение WM_COPYDATA. Затем предполагается использовать Sockets/winsock для отправки этого сообщения на сервер, написанный на Java. Клиент прекрасно подключается к серверу, но, похоже, он не может своевременно отправлять сообщения. Однако, как только клиент закрыт, все сообщения, которые он должен был отправлять, отправляются в один большой кусок. Ниже приведен пример вывода терминала сервера Java:Winsock только отправка данных при закрытии программы
Server Starting up.
Client Accepted.
hi from clienttesttesttesttesttesttesttesttesttesttesttesttesttesttest
первые две строки выводятся сервером Java, когда эти события происходят. Последняя строка - это сообщения от клиента. Клиент отправляет «привет от клиента» сразу после инициализации winsock, а затем «тестирует» в разных точках позже в программе, поскольку он получает данные из другой программы C++ через сообщения WM_COPYDATA.
Вот код сервера Java:
BufferedReader in = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
String incomingLine;
while((incomingLine = in.readLine()) != null)
System.out.println(incomingLine);
Вот функция C++, где посылаются сообщения:
void sendDataWinsock(char* text){
int result = send(ConnectSocket,text,(int)strlen(text),0);
}
А вот раздел WndProc, где обрабатываются сообщения WM_COPYDATA:
case WM_COPYDATA:
sendDataWinsock("test");
break;
Кто-нибудь знает, почему это делается? Это как если бы клиентская программа добавляла все эти сообщения в очередь вещей, которые она должна отправлять, но слишком занята, чтобы отправить их немедленно, и поэтому отправляет их только по мере закрытия программы, когда ей больше не нужно обрабатывать Сообщения Windows. Или, я полагаю, ошибка действительно может быть в коде Java - я довольно новичок в этом.
Ой, я действительно должен был это понять. Благодарю. – Oliver
Это, несомненно, причина того, что все сообщения объединяются (сторона-получатель), но алгоритм Nagle заставит записи задерживаться (сторона-отправитель) на короткое время, чтобы отправлять больше данных за меньшее количество пакетов. –
Алгоритм Нагле * может * заставлять записи задерживаться при определенных обстоятельствах. Это не задерживает все записи. – EJP