2016-05-19 5 views
-1

Вот мой код:RECV возвращение после 0x0000 байт найден

  • Client

    Position pos(1.0,2.0,0.45); 
    feedback feed(12, pos, 100); 
    msgpack::sbuffer sbuf; 
    msgpack::pack(sbuf, feed);   
    int test = write(tcp_client.sockfd, sbuf.data(),sizeof(sbuf)); 
    
  • Сервер:

    char* buffer = new char[41]; 
    int test = recv(TCP_server.newsockfd, buffer, 40, MSG_WAITALL); 
    
    for (int i=0; i< sizeof(buffer); i++) 
    std::cout << std::hex << (int)buffer[i] << " "; 
    std::cout << std::endl; 
    

Для других частей кодов, соединение установлено, и данные успешно переданы.

Сейчас проблема заключается в том, что я получил следующий вывод:

  • Клиент:

    ffffff94 b c ffffff93 ffffffca 3f ffffff80 0 0 ffffffca 40 0 0 0 ffffffca 3e ffffffe6 66 66 64 
    
  • Сервер:

    ffffff94 b c ffffff93 ffffffca 3f ffffff80 0 
    

    Есть ли причина, почему полученные данные прекратились после столкнувшись с первым символом 0x0000? когда я отправляю строку, все работает нормально, но не в этом конкретном случае.

Для записей, то recv() doc не очень помогает ...

+1

'SizeOf (буферные)' - Как вы считаете, это значение? – PaulMcKenzie

+0

Возвращаемое значение 'recv' должно использоваться для определения того, насколько далеко зацикливается. – PaulMcKenzie

+0

Не используйте форматирование кода для текста, который не является кодом. – EJP

ответ

2

Когда вы звоните recv, вы должны использовать возвращаемое значение из этой функции, чтобы определить количество байтов, вы должны обработать.

Вместо этого вы использовали sizeof(buffer), чтобы определить количество циклов, которые являются неправильными. buffer - char *, а sizeof(char *) обычно составляет 4 или 8, в зависимости от 32/64 бит.

Так что:

for (int i=0; i< sizeof(buffer); i++) 

должно быть:

int test = recv(TCP_server.newsockfd, buffer, 40, MSG_WAITALL); 
// assuming that test >= 0 
for (int i=0; i < test; i++) 
+0

ОК, я серьезно должен спать! половина глазного кодирования не работает! спасибо :) – Vtik

+1

также обратите внимание, что вы считаете, что tcp является протоколом, ориентированным на сообщения. т.е. вы отправляете 40 байт, а получатель получает 40 байт в куске. TCP ориентирован на поток, вы отправляете байты, а другой - байты. Единственная гарантия заключается в том, что все байты прибывают и что они поступают по порядку. Вы должны зациклиться на получении, чтобы получить все свое «сообщение», – pm100