gpt4 book ai didi

linux - 未读(unget)到 BSD 套接字?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:41:26 26 4
gpt4 key购买 nike

我的 C 程序已从 Linux 上的 TCP 套接字读取(使用 read(2)recv(2))几个字节。是否可以将这些字节推回,以便后续的 read(2)recv(2) 调用(在我无法控制的库内部深处发出)将读取又是他们?

我知道 recv(2)MSG_PEEK 标志,如果推回是不可能的,我将使用它作为解决方法。

最佳答案

我所要求的似乎是不可能的。我最终使用标志 MSG_PEEK 调用了 recv()。这将使库中的后续 recv() 或 recvmsg() 调用读取相同的数据。

在没有任何其他调用的情况下,我可以使用它方便地仅向前看一个字节。假设我需要向前看 2 个字节。我会调用 recv(fd, buf, 2, MSG_PEEK)。如果 2 个字节中的 1 个已经到达,那么 recv 将立即返回,无论我调用它多少次。我可以将 epoll_ctlEPOLLIN | 一​​起使用EPOLLET 等待第二个字节。如果我想知道之后是否有 EOF,我需要 EOPLLIN |埃波莱特 | EPOLLRDHUP。 (请注意 EPOLLHUP 不会在 EOF 时返回。)所以通过使用 epoll_ctl 我可以避免在繁忙的轮询循环中调用 recv读取第二个字节。

我刚刚在我的 Linux 系统上验证过,默认情况下我可以通过这种方式查看大约 900 kB 的套接字。 (默认情况下,SO_RECVBUF 对我来说是 1 MB,使用 setsockopt 减少它似乎减少了可以接收的数量,但不是一致的数量。也许我减少它太晚了?)

即使 MSG_PEEKEPOLLET 的组合也是一种解决方法,因为它们仍然不允许我将未读的任意字节发送到套接字。他们让我做的就是偷看已经到达的字节而不使用它们。

关于linux - 未读(unget)到 BSD 套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8687547/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com