从Boost.ASIO的套接字类中分离本机套接字

时间:2010-01-11 18:14:08

标签: c++ sockets boost boost-asio

是否可以从Boost.ASIO的套接字类中分离本机套接字?如果是这样,怎么办呢?我似乎无法在文档中找到任何明显的东西。

快速概述我正在努力实现的目标:我有一个使用Boost.ASIO建立连接并进行协商的类,然后在成功时传回本机Windows SOCKET或在失败时传回0。

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

2 个答案:

答案 0 :(得分:2)

回答我自己的问题。

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

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

答案 1 :(得分:0)

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

  1. shared_ptr中换行套接字,以便在传入不同的例程时不会关闭并保持活动状态(至少应该存在一个引用);
  2. 使用socket.native();
  3. 获取原生描述符
  4. 从kqueue中删除它:

    struct kevent event;
    EV_SET(&event, descriptor, EVFILT_READ, EV_DELETE, 0, 0, 0);  //or EVFILT_WRITE
    
  5. 如果需要,请将其阻止:

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