2015-04-08 2 views
1

Я использую этот код сервера:Как правильно прочитать из сообщения сокета (C++)

 [...] 
    while(1){ 
     bzero(buffer,256); 
     n = read(newsockfd,buffer,255); 
     if (n < 0) error("ERROR reading from socket"); 
     cout << "Message " << buffer << n << endl; 
    } 
    [...] 

На стороне клиента, я, между прочим (это Java):

out.writeUTF("MOVE"); 

Эта строка повторяется несколько раз. Но, когда я делаю это, выход я получаю:

Message 6 

Так что п является правильным, но буфер пуст.

Я также попытался:

out.writeBytes("MOVE"); 

И иногда я получаю это:

Message MOVE4 

Но иногда я получаю это:

Message M1 
Message O1 
Message V1 
Message E1 

Итак, что я могу сделать? Огромное спасибо.

+1

Ну, вы можете обеспечить соответствие кодировок и понять, что TCP - это служба потоковой передачи, и получение одного байта на каждый вызов чтения не является ошибкой. –

ответ

0

Первый пример записывает длину записанной строки как 16-разрядное число перед фактической строкой. Строка короче 256 символов, поэтому первый байт равен 0x00. Вам необходимо настроить способ чтения сообщения на стороне сервера. Для получения дополнительной информации см. this.

Во втором примере ваша проблема заключается в том, что вам не гарантировано, что вы получите все 4 символа в одном буфере. На мой взгляд, было бы лучше завершить вашу отправленную строку нулевым байтом и буфером, пока вы не получите этот байт.

2

Согласно documentation of the POSIX read function:

Если Филдс относится к розетке, следующим образом() должны быть эквивалентны RECV() без флагов, установленных.

и documentation of recv говорят следующее

Для потока на основе сокетов, такие как SOCK_STREAM, границы сообщения должны быть проигнорированы. В этом случае данные должны быть возвращены пользователю, как только он станет доступен, и данные не будут отброшены.

Таким образом, вы должны быть готовы к получению неполных данных (после одного вызова для чтения) или использования сокета на основе сообщений. Возможные способы обработки неполных данных - это передать размер сообщения или использовать специальное значение, такое как символ NUL, чтобы отметить конец сообщения.

Смежные вопросы