Winsock только отправляет данные при закрытии программы - PullRequest
1 голос
/ 10 марта 2010

У меня есть программа на c ++ / windows, которая получает данные от другой программы на c ++ через сообщение WM_COPYDATA. Затем предполагается использовать Sockets / winsock для отправки этого сообщения на сервер, написанный на Java. Клиент нормально подключается к серверу, но, похоже, не может своевременно отправлять сообщения. Однако после закрытия клиента все сообщения, которые он должен был отправлять, отправляются в один большой кусок. Вот пример вывода терминала сервера Java:

Server Starting up.
Client Accepted.
hi from clienttesttesttesttesttesttesttesttesttesttesttesttesttesttest

первые две строки выводятся сервером Java при возникновении этих событий. Последняя строка - это сообщения от клиента. Клиент отправляет «привет от клиента» сразу после инициализации winsock, а затем «тестирует» в различных точках позже в программе, так как он получает данные от другой программы на С ++ через сообщения 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 - я довольно новичок в этом.

1 Ответ

1 голос
/ 10 марта 2010

Вы читаете строки на сервере, но не отправляете строки.

Это означает, что ваш сервер сидит там, получая данные, но ожидая возврата строки текста обратно в вашу программу из readLine(), чего не происходит, так как никакие символы новой строки, \n, не отправляются. Когда клиент выходит, readLine () возвращает вам данные, которые он прочитал до сих пор.

...