2010-06-10 4 views
0

У меня есть данные из сокета, который является заголовком и сообщением. Заголовок, если из 5 байтов, 3-й и 4-й - длина сообщения.Чтение из сокета

Я читаю из сокета, может кто-нибудь предложить мне хорошую функцию, он вернет мне сообщение. , предполагая, что я читаю 1024 байта, и может случиться, что я получил только частичные данные.

ответ

1

Зачем вам читать 1024 байта? Прочитайте 5 байт, повторите чтение, если необходимо, до тех пор, пока вы на самом деле не достигнете . 5 байт (или ошибка). Затем вы знаете, как долго это сообщение само по себе: так многократно читайте, пока не получите все данные для сообщения. (На каждый вызов вы запрашиваете столько же данных, сколько хотите, конечно, поэтому, если при чтении заголовка вы сначала читаете 2 байта, то на следующем вызове вы запрашиваете 3 байта, то есть остаток заголовка .)

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

+0

Может ли предлагать код в C, сначала я прочитаю первые 5 байтов, заголовок i.e, возьму длину msg и прочитаю, чтобы получить мой msg. теперь снова я прочитаю 5 байтов чтения заголовка и снова msg, это то, что вы предлагаете – user363638

+0

@ user363638: я не буду писать код для вас (прошло некоторое время с тех пор, как я сделал C, и мне пришлось бы посмотри все) - какую часть предложения ты находишь? Вы знаете, как читать из сокета? Вы знаете, как использовать возвращаемое значение? Вы знаете, как преобразовать заголовок в длину сообщения? –

1

Вы должны поместить вызов в read()/recv() в цикл, который вы выходите, как только вы прочтете достаточно данных. Если получены только частичные данные, вы должны продолжить чтение, пока не получите достаточно, чтобы проанализировать пакет.