2010-01-11 7 views
6

Boost.ASIO의 소켓 클래스에서 네이티브 소켓을 분리 할 수 ​​있습니까? 그렇다면 어떻게 할 수 있습니까? 나는 문서에서 명백한 것을 발견 할 수 없다.Boost.ASIO의 소켓 클래스에서 네이티브 소켓 분리하기

내가 성취하고자하는 것에 대한 간단한 개요 : 나는 연결을 만들고 Boost.ASIO를 사용하여 협상을하고, 성공하면 기본 Windows 소켓을, 실패하면 0을 다시 전달합니다.

내가 잘못하지 않는 한 내 boost :: asio :: basic_socket이 소멸되면 원시 소켓이 닫히고 할당이 취소됩니다.

답변

2

내 질문에 답해주세요.

Windows에는 WSADuplicateSocket 함수가있어 네이티브 소켓을 복제하는 데 사용할 수 있습니다. 기본 소켓은이 소켓에 대한 모든 설명자가 할당 해제 될 때까지 열린 상태로 유지됩니다.

맥 OS X에 대한

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

0

다음을 수행하십시오 (리눅스 것은, 단지 바로 생각을 알 수정하는 것은 어렵지 않아) :

    shared_ptr에서
  1. 랩 소켓, 그것은 원 있도록 다른 루틴으로 넘어갈 때 닫고 살아 있어야합니다 (적어도 하나의 참조가 항상 있어야합니다).

    struct kevent event; 
    EV_SET(&event, descriptor, EVFILT_READ, EV_DELETE, 0, 0, 0); //or EVFILT_WRITE 
    
  2. 그리고 필요한 경우 차단을합니다 :

  3. 는 kqueue에서 제거 socket.native();
  4. 네이티브 기술자를 얻기

    fcntl(descriptor, F_SETFL, fcntl(descriptor, F_GETFL, 0) & ~O_NONBLOCK); 
    
나는 그것 정확하게 명확하지 알고
+0

하지만 코드 다음 목록 요소는 8 개의 들여 쓰기가 필요합니다 - [here] (http://meta.stackexchange.com/questions/24424/list-preceeding-code-prevents-code-f 참조) ROM으로 표시되는 코드). –