Чтение из сокета, пока определенный символ не будет в буфере

Я пытаюсь прочитать из сокета в буфер, пока не будет достигнут определенный символ с помощью 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++;
}

Любые непрочитанные данные должны быть прочитаны в какой-то момент, если только что отправленные данные должны быть прочитаны.

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

Другие вопросы по тегам