繁体   English   中英

未读(unget)到BSD套接字?

[英]Unread (unget) to a BSD socket?

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

flag of recv(2) , and I'm going to use it as a workaround if pushing back turns out to be impossible. 我知道recv(2)标志,如果推回原来是不可能的话,我将把它用作解决方法。

最好的选择是更改工作流程,这样您就不需要读取然后再推回数据。 看起来两次似乎很丑陋(我同意这可能是合法的)。

但是如果这不可能或非常困难,你可以使用LD_PRELOADdlsym )劫持readrecv系统调用。

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

没有任何其他调用,我可以使用它来方便地向前看只有一个字节。 我们假设我需要向前看2个字节。 我打电话给recv(fd, buf, 2, MSG_PEEK) 如果2个字节中的1个已经到达,那么无论我多少次调用它,recv都会立即返回。 我可以将epoll_ctlEPOLLIN | EPOLLET EPOLLIN | EPOLLET等待第二个字节。 如果我想知道之后是否有EOF,我需要EOPLLIN | EPOLLET | EPOLLRDHUP EOPLLIN | EPOLLET | EPOLLRDHUP EOPLLIN | EPOLLET | EPOLLRDHUP (请注意, EPOLLHUP不会在EOF上返回。)因此,通过使用epoll_ctl我可以避免在繁忙的轮询循环中调用recv来读取第二个字节。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM