从Boost.ASIO的套接字类中分离出本地套接字
问题描述:
是否可以从Boost.ASIO的套接字类中分离出本地套接字?如果是这样,该怎么办?我似乎无法在文档中找到任何明显的东西。从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);
我知道它不完全明显,但码以下列表元素需要8个空格缩进 - 请参阅[这里](http://meta.stackexchange.com/questions/24424/list-preceeding-code-prevents-code-f ROM感显示的-AS-代码)。 – 2010-07-14 18:15:15