2010-01-11 49 views
6

Có thể tách ổ cắm riêng ra khỏi ổ cắm của Boost.ASIO không? Nếu vậy, làm thế nào nó có thể được thực hiện? Tôi dường như không thể tìm thấy bất cứ điều gì rõ ràng trong tài liệu.Tách một ổ cắm riêng khỏi ổ cắm của Boost.ASIO

Tổng quan nhanh về những gì tôi đang cố gắng hoàn thành: Tôi có một lớp tạo kết nối và thực hiện một số thương lượng bằng cách sử dụng Boost.ASIO, sau đó chuyển trở lại SOCKET của Windows thành công hoặc 0 khi không thành công.

Trừ khi tôi bị nhầm lẫn, ổ cắm gốc sẽ bị đóng và deallocated khi tăng của tôi :: asio :: basic_socket bị hủy.

Trả lời

2

Trả lời câu hỏi của riêng tôi.

Windows có chức năng WSADuplicateSocket, có thể được sử dụng để nhân bản ổ cắm gốc. Ổ cắm bên dưới sẽ vẫn mở cho đến khi tất cả các bộ mô tả cho socket này được deallocated.

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

0

Đối với Mac OS X làm như sau (đối với Linux nó không phải là khó để thay đổi, chỉ cần chú ý đến ý tưởng rất):

  1. ổ cắm Bọc trong một shared_ptr, vì vậy mà nó đã giành không kết thúc khi đi vào các thói quen khác nhau và giữ cho nó sống (ít nhất một tham chiếu phải luôn luôn tồn tại);
  2. Nhận một mô tả nguồn gốc với socket.native();
  3. Hủy bỏ nó từ kqueue:

    struct kevent event; 
    EV_SET(&event, descriptor, EVFILT_READ, EV_DELETE, 0, 0, 0); //or EVFILT_WRITE 
    
  4. Và làm cho nó chặn nếu cần thiết:

    fcntl(descriptor, F_SETFL, fcntl(descriptor, F_GETFL, 0) & ~O_NONBLOCK); 
    
+0

Tôi biết nó không chính xác rõ ràng nhưng mã các yếu tố danh sách sau cần 8 dấu cách không gian - xem [tại đây] (http://meta.stackexchange.com/questions/24424/list-preceeding-code-prevents-code-f rom-being-display-as-code). –