为什么UDP套接字不关闭原因选择要返回

Why doesnt UDP socket close cause select to return?

本文关键字:选择 返回 UDP 套接字 为什么      更新时间:2023-10-16

i在FDSET上有一个选择,其中包括一些TCP连接和一个未结合的UDP连接。在Windows中,当我从另一个线程关闭UDP连接的套接字时,它就标志着选择要返回的选择。但是,在Ubuntu中,情况并非如此,为什么?

如果这取决于您是否试图在 select或之前 select(and FD_SET)之前关闭fd 。在这两种情况下,由于下面规定的原因,行为都是不确定的。也许它在Windows下做一件事,但您不能依靠它。

如果您试图在中关闭fd select(即在输入select()系统调用后但在返回之前),则该行为是未定义的,因为此处列出的原因:如果您关闭(2)单独的线程中的文件描述符(2)?

是否可以选择(2)?

如果您试图在 select(和 FD_SET)之前关闭FD ,那么您正在尝试使用FD_SET,然后在现已关闭的FD上进行select(),即无效。标准在这里:http://pubs.opengroup.org/onlinepubs/009695399/functions/select.html,这说FD_SET宏甚至可能都不要求select()查看您的FD。

如果FD参数较少,这些宏的行为是不确定的 大于0或大于或等于fd_setsize,或者如果FD不是有效的 文件描述符,或任何参数是表达式 效果。

如果这样做(并且仅在此功能时),则select应返回EBADF

在以下条件下,pselect()和select()应失败,并且 将errno设置为:

[ebadf]指定文件的一个或多个文件描述符设置 不是有效的打开文件描述符的描述符。

但是您无法知道情况,因为FD_SET可能同样忽略了无效的文件描述符。

为了完整性,如果您在close之前进行FD_SET,但是进行select,则应查看EBADF