Чтение из сокета, пока определенный символ не окажется в буфере - PullRequest
1 голос
/ 22 февраля 2012

Я пытаюсь читать из сокета в буфер, пока не будет достигнут определенный символ, используя read(fd, buf, BUFFLEN).

Например, сокет получит две партии информации, разделенные пустой строкой в ​​одном чтенииcall.

Можно ли поместить цикл чтения в цикл, чтобы он останавливался при достижении этой пустой строки, а затем мог прочитать остальную информацию позже, если это потребуется?

Ответы [ 2 ]

3 голосов
/ 22 февраля 2012

Простой подход состоит в том, чтобы читать по одному байту за раз, пока предыдущий байт и текущий байт не будут символами новой строки, поскольку два последовательных символа новой строки являются пустой строкой:

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++;
}

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

0 голосов
/ 22 февраля 2012

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

...