【问题标题】:Closing a UDP Socket when using Non-Blocking IO使用非阻塞 IO 时关闭 UDP 套接字
【发布时间】: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


【解决方案1】:

是否存在与尽快关闭文件描述符相关的问题 鉴于对 sendto() 的调用已完成,因为它是非阻塞的?

那里没有问题——一旦sendto() 返回(返回非错误值),您的数据已被复制到系统缓冲区中,可以视为“已发送”。关闭套接字不会阻止数据流出。

我也对任何线程安全注意事项感兴趣 多个线程同时在上面?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 2011-09-12
    相关资源
    最近更新 更多