tcp: почему только второй вызов Socket.Receive (byte []) возвращает данные? - PullRequest
0 голосов
/ 27 марта 2012

У меня типичная ситуация. Мне нужно отправить "запрос" на сервер через TCP и получить ответ.

// socket is connected
socket.Send(CreateRequest());
byte[] br = new byte[VERY_BIG_BUFFER];
int count = socket.Receive(br);   // only 4 bytes received: 15 0 0 0
count = socket.Receive(br);       // here I receive data I actually need

Однако по какой-то причине мне приходится дважды звонить socket.Receive, чтобы все заработало. При дополнительном вызове я получаю только четыре байта: 15 0 0 0.

Жесткое кодирование одного дополнительного звонка без понимания, зачем мне это нужно, может привести к странным проблемам. Кто-нибудь знает, что происходит и зачем мне нужен дополнительный звонок?

1 Ответ

2 голосов
/ 27 марта 2012

TCP - это потоковый протокол.У него нет концепции сообщений.Это просто последовательность байтов.

Это означает, что он может разбить один send вызов на несколько receive вызовов и может объединить несколько send вызовов в один receive вызов или их комбинацию..

Вам нужно как-то разграничить свои сообщения.Префикс длины является популярным выбором для двоичных протоколов.

...