6

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

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

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

4

2 回答 2

2

回答我自己的问题。

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

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

于 2010-01-11T18:34:40.863 回答
0

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

  1. 将 socket 包裹在 ashared_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);
    
于 2010-07-14T18:06:16.957 回答