使用非阻塞 IO 时关闭 UDP 套接字

Closing a UDP Socket when using Non-Blocking IO

以下代码打开一个套接字,将其设置为非阻塞并使用 UDP 通过它发送一些数据,然后关闭套接字:

int fd = socket(PF_INET, SOCK_DGRAM, 0);
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
sendto(fd, str.c_str(), str.length(), 0,
     (struct sockaddr*)&addr, sizeof(addr));
close(fd);

如果 sendto() 是非阻塞的,一旦调用完成就关闭文件描述符是否有任何问题?

我也对在多个线程中同时执行上述操作的任何线程安全注意事项感兴趣?

Is there any issue associated with closing the file descriptor as soon as the call to sendto() has completed given that it's non-blocking?

没有问题——一旦 sendto() 已 returned(具有非错误 return 值),您的数据已被复制到系统缓冲区中,可以考虑"sent"。关闭套接字不会阻止数据出去。

I'm also interested in any thread-safety considerations with doing the above in multiple threads concurrently?

那里也没有问题 -- 因为没有跨线程的数据共享,所以不存在竞争条件。