- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经在轮询 TCP 守护程序上工作了一段时间。最近,我了解到非阻塞套接字有时会在 send() 或 recv() 期间抛出 EWOULDBLOCK 错误。我的理解是,如果 recv() 抛出一个 EWOULDBLOCK,这(通常)意味着没有任何东西可以接收。但我不清楚的是在什么情况下 send() 会抛出 EWOULDBLOCK,以及处理此类事件的正确程序是什么?
如果 send() 抛出一个 EWOULDBLOCK,守护进程是否应该简单地从该事件继续到下一个事件?使用像 epoll 这样的轮询接口(interface),当描述符准备好写入时是否会触发新事件?
最佳答案
what I'm unclear on is under what circumstances send() would throw an EWOULDBLOCK
当发送缓冲区(通常由操作系统保存,但无论如何,位于 TCP/IP 堆栈中的某处)已满且对方尚未确认从缓冲区发送给它的任何位时(因此堆栈必须保留缓冲区中的所有内容,以防需要重新发送)。
what would be proper procedure for handling such an event?
以某种方式,您必须等到对方确实确认发送给它的一些数据包,从而允许 TCP/IP 堆栈释放一些空间以进行更多“发送”。经典的 select
和更现代的 epoll
(以及在其他操作系统中,kqueue
&c)都提供了执行此类等待的智能方法(无论您是在等待读一些东西,写一些东西,或者“两者中先发生的”)。是的,watched-descriptors 准备就绪(无论是用于读取还是用于写入)是 epoll
事件的典型原因!
关于c - 通过轮询非阻塞套接字正确处理 EWOULDBLOCK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3673828/
在套接字通信中: 在阻塞模式下,send()将返回发送的字节数,然后我必须重复send()直到所有数据都已发送或套接字错误。 在非阻塞模式下,如果send()无法立即发送所有数据,则会返回 EAGAI
我在非阻塞模式下使用套接字,客户端不断向服务器发送数据,虽然我为套接字设置的缓冲区足够大以保存来自客户端的所有数据但是Ewouldblock总是抛出,我不知道为什么,你能解释一下吗我详细介绍了这个 E
我正在尝试从远程 GUI 应用程序访问路由器上的系统日志消息。基本上路由器上的 WEB 服务器打开系统日志文件 (/var/log/messages),读取所有日志消息并尝试根据用户请求通过此 WEB
我已经在轮询 TCP 守护程序上工作了一段时间。最近,我了解到非阻塞套接字有时会在 send() 或 recv() 期间抛出 EWOULDBLOCK 错误。我的理解是,如果 recv() 抛出一个 E
我开发了一个 Android 应用程序,它有多个设备通过蓝牙套接字连接将数据发送回服务器设备,但是我遇到了错误: E/bt-btif: send none, EAGAIN or EWOULDBLOCK
有人可以告诉我们是否 EWOULDBLOCK。作品发送到()?如果是!请举个例子...谢谢!如果没有,有没有类似accept error的东西? 感谢您的回复 最佳答案 你问的不是很清楚。谷歌搜索 s
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
我想经常将数据附加到本地文件系统上的文件中。我想在不阻塞太久的情况下执行此操作,并且不创建任何工作线程。在 Linux 内核 2.6.18 上。 似乎 Linux 上 glibc 的 POSIX AI
我试图在特定时间间隔后在套接字中写入一些数据。我有两个线程,一个线程维护 TCP 连接,另一个线程生成数据。 The data generation therad生成数据,并将其写入共享内存。服务器线
在Unix上,如果出站套接字缓冲区已满,则非阻塞套接字上的send()可能返回错误EWOULDBLOCK。在这种情况下,应该调用select()以确定何时可以重试。非阻塞模式下的Boost socke
我正在阅读一些代码并且遇到了这一行 socket.error errno.EWOULDBLOCK 谁能告诉我引发此错误的条件是什么? 最佳答案 来自 Python 的套接字模块:http://docs
我从APUE修改了一个程序,程序先打开一个文件,然后将fd标记为非阻塞,然后继续写入fd,直到write return -1。 我认为由于磁盘 I/O 很慢,当 OS 中的写入缓冲区快满时,写入系统调
我需要了解 EAGAIN 和 EWOULDBLOCK 之间的区别,因为我看到许多源代码仅针对 EAGAIN 检查(可能两个代码代表相同的数字,请在此处纠正我。) 我的部分知识:对于阻塞套接字,如果发送
我的代码使用 epoll 进行多路复用。遇到 EPOLLIN 后,它从就绪套接字中读取一个字节。 read(fd, &onebyte, 1); 上面的行能返回EWOULDBLOCK吗? 最佳答案 是的
Ubuntu Linux,2.6.32-45内核,64b,Perl 5.10.1 我将许多新的IO::Socket::UNIX流套接字连接到服务器,并且大多数情况下它们工作良好。但是有时在速度更快的处
在 aio_read 中,我们在 aiocb 结构上使用 aio_error 函数来检查操作是否完成。对我来说,这似乎与轮询和读取相同,然后检查 EWOULDBLOCK 作为返回值。 最佳答案 we
我有一个基于 react 器的设计,其中多个套接字文件描述符在 epoll_wait 中轮询。 为了优化延迟而非吞吐量,在写入套接字时,我们尝试立即直接写入文件描述符。 在 EWOULDBLOCK 事
我想知道下面的场景是否真实?! 非阻塞 TCP 套接字上的 select() (RD) 表示套接字已准备就绪 尽管调用了 select(),但 recv() 之后将返回 EWOULDBLOCK 最佳答
你好 Stackoverflowers, 我是 Perl 的 autodie 的作者pragma,它改变了 Perl 的内置函数以在失败时抛出异常。它类似于 Fatal ,但具有词法作用域、可扩展的异
非阻塞套接字的手册页中详细记录了两种情况: 如果 send() 返回与传输缓冲区相同的长度,整个传输 成功完成,套接字可能会或可能不会处于返回 EAGAIN/EWOULDBLOCK 的状态,下一次调用
我是一名优秀的程序员,十分优秀!