【发布时间】:2020-02-01 04:02:08
【问题描述】:
以下代码打开一个套接字,将其设置为非阻塞并使用 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() 的调用完成,是否存在与关闭文件描述符相关的任何问题?
我还对在多个线程中同时执行上述操作时的任何线程安全考虑感兴趣?
【问题讨论】:
-
在
close调用之后,只要另一个线程不接触fd,就可以了。 -
您的问题在于没有检查
sendto的返回值:尤其是因为您将套接字设置为非阻塞模式,您不能假设 anything at all 具有“完成”只是因为sendto已返回。
标签: c++ sockets udp nonblocking