是否可以从Boost.ASIO的套接字类中分离本机套接字?如果是这样,怎么办呢?我似乎无法在文档中找到任何明显的东西。
快速概述我正在努力实现的目标:我有一个使用Boost.ASIO建立连接并进行协商的类,然后在成功时传回本机Windows SOCKET或在失败时传回0。
除非我弄错了,否则当我的boost :: asio :: basic_socket被破坏时,本机套接字将被关闭并释放。
答案 0 :(得分:2)
回答我自己的问题。
Windows有一个WSADuplicateSocket函数,可用于复制本机套接字。底层套接字将保持打开状态,直到释放此套接字的所有描述符为止。
http://msdn.microsoft.com/en-us/library/ms741565(VS.85).aspx
答案 1 :(得分:0)
对于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);