Исходя из вашей публикации, я предполагаю, что вы используете TCP / IP, так как вы имеете в виду потоковую передачу, но сокет может использоваться и для протокола без установления соединения UDP (и других). UDP очень прост, поскольку вы отправляете только фиксированные сообщения (без потоковой передачи).
В любом случае, поскольку вы имеете в виду получать поток сообщений, я должен предположить, что вы используете TCP / IP, и если вы используете сокет напрямую, у вас есть серьезные проблемы с тем, что вы ищете .
TCP / IP - потоковое решение, поэтому то, что я добавляю на одном конце, получается на другом, и оно всегда будет в порядке, но не обязательно вместе. Поэтому, если на одном конце вы напишите «Hello World», при чтении вы можете получить «Hello World», или «Hello» и «World», или даже «H» «ello World». Суть в том, что нет способа вызвать чтение и ожидать получения всего сообщения.
То, как я делал это в прошлом, это просто наличие промежуточного потока (или в моем случае я просто использовал пул потоков .net), который быстро читает сокет, повторно собирает сообщения и затем передает их в очередь для обработки. Хитрость заключается в повторной сборке, так как вы не знаете, что вы получите. Скажем, в вашем заголовке длина сообщения - int32, это 4 байта. Когда вы вызываете read, вам может даже понадобиться пересобрать эту длину, поскольку вы получили только первый байт из 4 байтов, которые вам нужны для определения длины.
Звучит так, как будто ваш заголовок имеет фиксированную длину, поэтому в основном то, что вам нужно сделать, предполагая, что callerid и length - это значения uint32. Попробуйте прочитать 8 байтов, если меньше 8, поместите в буфер, пока мы не прочитаем 8 байтов. Как только мы прочитаем 8 байтов, возьмем 4 байта и получим длину, выделим буфер для длины сообщения. Попробуйте и прочитайте, пока мы не заполним буфер, как только мы это сделаем, поместите это в очередь для определенного callerid и сообщите потоку, что есть новое сообщение, если оно спит. Затем возьмите все, что осталось, и начните сначала или дождитесь новых данных.
В прошлом я успешно использовал это, и это добавляет относительно немного накладных расходов.