Чтение из сокета, пока определенный символ не будет в буфере
Я пытаюсь прочитать из сокета в буфер, пока не будет достигнут определенный символ с помощью read(fd, buf, BUFFLEN)
,
Например, сокет получит две партии информации, разделенные пустой строкой в одном вызове чтения.
Можно ли поместить вызов чтения в цикл, чтобы он останавливался, когда достигнет этой пустой строки, а затем сможет прочитать остальную информацию позже, если это потребуется?
2 ответа
Простой подход состоит в том, чтобы читать один байт за раз, пока предыдущий байт и текущий байт не будут символами новой строки, поскольку два последовательных символа новой строки являются пустой строкой:
size_t buf_idx = 0;
char buf[BUFFLEN] = { 0 };
while (buf_idx < BUFFLEN && 1 == read(fd, &buf[buf_idx], 1)
{
if (buf_idx > 0 &&
'\n' == buf[buf_idx] &&
'\n' == buf[buf_idx - 1])
{
break;
}
buf_idx++;
}
Любые непрочитанные данные должны быть прочитаны в какой-то момент, если только что отправленные данные должны быть прочитаны.
Вам все еще нужно читать из сокета, если вы хотите получить доступ к этой информации позже, иначе она будет потеряна. Я думаю, что лучшая реализация будет заключаться в том, чтобы продолжать зацикливать чтение из сокета, в то время как другой процесс / поток запускается для выполнения любой операции, которую вы хотите, когда принимается пустое подобное.