У вас уже есть хорошие ответы здесь, но я думаю, что есть концепция, которую мы должны объяснить.
Когда вы отправляете данные через потоки (то есть что-то, что записывает несколько байтов с одного конца, и эти байты могут быть прочитаны в том же порядке на другом конце), вы почти всегда хотите знать, когда остановиться чтение. Это обязательно, если вы отправите несколько вещей: когда первое сообщение прекратится, а второе начнется? В потоке все путается.
Итак, как мы делим сообщения? Есть три простых способа (и многие другие не столь простые, конечно):
1 фиксированной длины сообщения: Если вы заранее знаете, что каждое сообщение, скажем, 10-байт длиной, то дон У меня проблема. Вы просто прочитали 10 байт, а 11-я часть будет частью другого сообщения. Это чрезвычайно просто, но также чрезвычайно жестко.
2-разделителей символы или строки: Если вы отправляете удобочитаемый текст, вы можете разграничить ваши сообщения так же, как разграничивать строки в вашем char*
-х: Выставлении 0 символа в конце. Таким образом, когда вы читаете 0, вы знаете, что сообщение завершено, и все остальные данные в потоке принадлежат другому сообщению.
Это нормально для текста ascii, но когда дело доходит до произвольных данных, оно также является довольно жестким: есть символ или последовательность символов, которые ваши сообщения не могут содержать (или ваша программа будет запутаться относительно того, где сообщение заканчивается).
3 Заголовки сообщений: Это лучший подход для произвольной длины, произвольных сообщений контента. Перед отправкой любых фактических данных сообщения отправьте заголовок фиксированной длины (или используйте метод nr 2, чтобы отметить конец заголовка), указав метаданные о своем сообщении. Например, это длина.
Скажите, что вы хотите отправить сообщение «Прохладный», как вы сказали. Сначала отправьте байт (или 2-байтное короткое, или 4-байтное целое число, или что-то еще), содержащее «4», длину сообщения и получите его на другом конце. Вы знаете, что до того, как какое-либо сообщение поступит, вы должны прочитать 1 байт (или 2o, или 4 или что-то еще), поэтому сохраните это где-нибудь, а затем прочитайте оставшиеся указанные байты.
Очень простой пример:
struct mheader {
int length;
};
(...)
struct mheader in_h;
read(fd, &in_h, sizeof(struct mheader);
if (in_h.length > 0)
read(fd, buffer, in_h.length)
Надеется, что это помогает. Удачи!
Вы не наполовину в замешательстве, так как я –