是否可以从 Boost.ASIO 的套接字类中分离本机套接字?如果是这样,怎么办?我似乎在文档中找不到任何明显的东西。
作为我要完成的任务的快速概述:我有一个类可以建立连接并使用 Boost.ASIO 进行一些协商,然后在成功时传回本机 Windows SOCKET 或在失败时传回 0。
除非我弄错了,否则当我的 boost::asio::basic_socket 被破坏时,本机套接字将被关闭并释放。
是否可以从 Boost.ASIO 的套接字类中分离本机套接字?如果是这样,怎么办?我似乎在文档中找不到任何明显的东西。
作为我要完成的任务的快速概述:我有一个类可以建立连接并使用 Boost.ASIO 进行一些协商,然后在成功时传回本机 Windows SOCKET 或在失败时传回 0。
除非我弄错了,否则当我的 boost::asio::basic_socket 被破坏时,本机套接字将被关闭并释放。
回答我自己的问题。
Windows 有一个 WSADuplicateSocket 函数,可以用来复制本机套接字。底层套接字将保持打开状态,直到该套接字的所有描述符都被释放。
http://msdn.microsoft.com/en-us/library/ms741565(VS.85).aspx
对于 Mac OS X,请执行以下操作(对于 Linux,修改并不难,请注意这个想法):
shared_ptr
中,这样它在传递到不同的例程时不会关闭并使其保持活动状态(至少应该始终存在一个引用);socket.native();
从 kqueue 中删除它:
struct kevent event;
EV_SET(&event, descriptor, EVFILT_READ, EV_DELETE, 0, 0, 0); //or EVFILT_WRITE
并在需要时使其阻塞:
fcntl(descriptor, F_SETFL, fcntl(descriptor, F_GETFL, 0) & ~O_NONBLOCK);