【问题标题】:Reading from a socket until certain character is in buffer从套接字读取直到某个字符在缓冲区中
【发布时间】:2012-02-22 16:05:46
【问题描述】:

我正在尝试从套接字读取到缓冲区,直到使用 read(fd, buf, BUFFLEN) 到达某个字符。

例如,套接字将在一次读取调用中接收由空行分隔的两批信息。

是否可以将读取调用置于循环中,使其在到达此空白行时停止,然后如果需要,它可以稍后读取其余信息?

【问题讨论】:

  • 如果我对你的问题有正确的解释,你想显示第一批信息然后空闲几秒钟等待下一个吗?

标签: c sockets berkeley-sockets


【解决方案1】:

一个简单的方法是一次读取一个字节,直到前一个字节和当前字节是换行符,因为两个连续的换行符是一个空行:

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

如果要读取新发送的数据,则必须在某个时候读取任何未读取的数据。

【讨论】:

  • 我最初的想法也是一次一个字符,但我很难一次读取一个字符:inline ` int rlen;诠释 i = 0; while ((rlen = read(proxyFd, &buf[i], 1)) > 0) { if (strstr(&buf[0], "\n\n")) { printf("bingo\n");休息; } 我 += rlen; } `
  • @DMcB1888,当您使用buf[0] 时,您只会比较buf 和"\n\n" 中的前两个字符。试试strstr(&amp;buf[i - 1], "\n\n"),但make确定i &gt; 0。
【解决方案2】:

如果你以后想访问这些信息,你仍然需要从套接字中读取,否则会丢失。我认为最好的实现是保持从套接字循环读取,同时启动另一个进程/线程以在收到空白时执行您想要的任何操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    相关资源
    最近更新 更多