为什么80%的码农都做不了架构师?>>>
问题:什么情况UDP的非阻塞写会失败?
回答:
- 最大的可能原因是内核中outgoing-data buffer满了,会导致send()/sendto()返回-1,errno是EWOULDBLOCK。
- 请注意,非阻塞的send()/sendto()在返回时并不会真正把数据从网路设备发出去,而是把数据拷贝到内核缓冲区就立即返回了。
- 后续是内核负责尽快把数据从网路设备发送出去。
- 如果你的程序向内核outgoing-data缓冲区写入数据,比内核从设备发出数据更快,就会导致outgoing-data缓冲区满,进而导致写失败。
- 还有一种失败的可能是IP地址非法,需要判断errno错误码。