【问题标题】:Detaching a native socket from Boost.ASIO's socket class从 Boost.ASIO 的套接字类中分离原生套接字
【发布时间】:2011-01-03 20:52:57
【问题描述】:

是否可以从 Boost.ASIO 的套接字类中分离原生套接字?如果是这样,怎么办?我似乎在文档中找不到任何明显的内容。

作为我要完成的任务的快速概述:我有一个类,它使用 Boost.ASIO 建立连接并进行一些协商,然后在成功时传回本机 Windows SOCKET,在失败时传回 0。

除非我弄错了,否则当我的 boost::asio::basic_socket 被破坏时,本机套接字将被关闭并释放。

【问题讨论】:

    标签: c++ sockets boost boost-asio


    【解决方案1】:

    回答我自己的问题。

    Windows 有一个 WSADuplicateSocket 函数,可以用来复制本机套接字。底层套接字将保持打开状态,直到该套接字的所有描述符都被释放。

    http://msdn.microsoft.com/en-us/library/ms741565(VS.85).aspx

    【讨论】:

      【解决方案2】:

      对于 Mac OS X,请执行以下操作(对于 Linux,修改并不难,请注意这个想法):

      1. 将套接字包装在shared_ptr 中,这样它在传递到不同的例程时不会关闭并使其保持活动状态(至少应始终存在一个引用);
      2. 使用socket.native(); 获取本机描述符
      3. 从 kqueue 中移除它:

        struct kevent event;
        EV_SET(&event, descriptor, EVFILT_READ, EV_DELETE, 0, 0, 0);  //or EVFILT_WRITE
        
      4. 如果需要,让它阻塞:

        fcntl(descriptor, F_SETFL, fcntl(descriptor, F_GETFL, 0) & ~O_NONBLOCK);
        

      【讨论】:

      • 我知道这不是很明显,但列表元素后面的代码需要 8 个空格缩进 - 请参阅 here
      猜你喜欢
      • 2010-12-12
      • 2022-01-20
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 2013-11-02
      • 2017-02-10
      • 2015-11-28
      • 1970-01-01
      相关资源
      最近更新 更多