UDP非阻塞写入故障 [英] UDP non blocking write failure

查看:0
本文介绍了UDP非阻塞写入故障的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我研究过非阻塞的TCP,因为在非阻塞的情况下,读写都可能失败。如果没有可用的数据,则TCP非阻塞读取可能失败,如果对等端的TCP缓冲区已满(我希望TCP缓冲区大小为64K),则TCP写入可能失败。

同样,如果没有可用的数据,UDP读取(recvfrom)可能会失败。但是,UDP写入(sendto)的失败情况是什么?我认为在UDP写入中不会有任何非块错误。因为TCP WRITE发送数据并等待来自另一端的ACK。但这不是UDP写入的情况,它只会发送和出来,并且不等待来自对等端的任何ACK。如果它不发送到另一端,则意味着它的分组丢失。

我对UDP非阻塞写入的理解是否正确?请解释一下?

udp

推荐答案非阻塞发送失败的最可能原因是udp套接字的内核内传出数据缓冲区已满。在本例中,end()/sendto()将返回-1,errno将设置为EWOULDBLOCK。

请注意,非阻塞的end()/sendto()实际上不会在数据返回之前将数据发送出网络设备;相反,它会将数据复制到内核内缓冲区并立即返回,然后由内核负责尽快将数据移出网络。如果您的程序尝试一次发送大量数据,传出数据缓冲区可能会变满,因为CPU将新数据添加到缓冲区的速度比网络硬件将缓冲区的数据转发到网络的速度快得多。

如果您收到-1/EWOULDBLOCK错误,通常最合适的处理方法是停止尝试在该套接字上发送,直到套接字选择()(或Poll()等)为可写入。当发生这种情况时,您知道内核中的缓冲区至少已部分耗尽,您可以再次尝试调用end()/sendto()。

如果您试图发送到的IP地址无效,则会导致Send()出现错误的另一个原因(可能性较小)。在任何情况下,您都应该检查errno并找出errno值是什么,因为这将使您更好地了解哪里出了问题。

btw上述行为也不是UDP独有的;如果您尝试在套接字上发送()数据的速度快于本地网卡排出套接字的内核内缓冲区的速度,则非阻塞的TCP套接字可能也会遇到同样的问题(即使远程对等方的接收窗口未满)。

这篇关于UDP非阻塞写入故障的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆