- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的 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_ctl 与 EPOLLIN | 一起使用EPOLLET
等待第二个字节。如果我想知道之后是否有 EOF,我需要 EOPLLIN |埃波莱特 | EPOLLRDHUP
。 (请注意 EPOLLHUP
不会在 EOF 时返回。)所以通过使用 epoll_ctl
我可以避免在繁忙的轮询循环中调用 recv读取第二个字节。
我刚刚在我的 Linux 系统上验证过,默认情况下我可以通过这种方式查看大约 900 kB 的套接字。 (默认情况下,SO_RECVBUF
对我来说是 1 MB,使用 setsockopt 减少它似乎减少了可以接收的数量,但不是一致的数量。也许我减少它太晚了?)
即使 MSG_PEEK
和 EPOLLET
的组合也是一种解决方法,因为它们仍然不允许我将未读的任意字节发送到套接字。他们让我做的就是偷看已经到达的字节而不使用它们。
关于linux - 未读(unget)到 BSD 套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8687547/
假设input.txt是一个1字节的文本文件: std::ifstream fin("input.txt", std::ios::in); fin.get(); // 1st
我正在二进制文件中寻找一个 2 字节序列,该序列太大而无法放入内存。我不能一次简单地读取 2 个字节,因为,例如 xx xx x1 2x xx 同样,我不能简单地查找第一个,然后查看第二个是否存在,因
我正在从 ifstream 中读取字符,如果这些字符不符合特定条件,那么我将 unget() 次数等于这些字符。在我到达文件末尾之前,这一切都很好。然后,如果我尝试 unget(),则好的位设置为 0
我有以下 C++ 程序并在 Windows 7 上使用 Visual Studio 2008 运行它。我获取然后取消获取一个字符。这样做之后,文件位置就不同了。为什么?我该如何解决这个问题? test
我正在使用标准 iostream 从文件中获取一些输入,我对 unget() 与 putback(character) 感到困惑。在我看来,这些函数实际上是相同的,其中 unget() 只记得输入的字
unget 并没有像我想象的那样工作……让我自己解释一下。正如我所想,unget 获取流中提取的最后一个字符,并将其放回流中(并准备好再次提取)。在内部,它正在减少流缓冲区中的指针(创建哨兵和所有这些
昨天我在相当简单的代码中发现了一个奇怪的错误,该错误基本上是从 ifstream 获取文本并将其标记化。实际上失败的代码进行了多次 get()/peek() 调用以查找 token “/*”。如果在流
我的 C 程序已从 Linux 上的 TCP 套接字读取(使用 read(2) 或 recv(2))几个字节。是否可以将这些字节推回,以便后续的 read(2) 和 recv(2) 调用(在我无法控制
有人可以澄清我对 cin.unget() 函数的一点困惑吗?请考虑这段代码: void skip_to_int() { if (cin.fail()) {
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
我有一些解析代码允许将转义序列输入到文本字符串中: // In a file or large, multi-line string ... my_parameter="A setting for t
我是一名优秀的程序员,十分优秀!