2012-01-27 8 views
10

Tôi muốn biết cách sử dụng thứ gì đó hoạt động giống như Ổ cắm miền Unix trên Windows.AF_UNIX tương đương với Windows

Hành vi là: Quá trình sẽ là "máy chủ" và nhận kết nối từ các quy trình khác và nó có thể giữ và sử dụng kết nối từ các quy trình khác nhau, như một cổng TCP.

Ổ cắm IP không phải là giải pháp, vì nó đòi hỏi phải chọn cổng, quy trình từ các ứng dụng khác có thể cần cổng được chọn và cổng mở có thể được nhìn thấy trong mạng.
Tôi không biết nếu ống được đặt tên có thể nhận và giữ nhiều khách hàng, nhưng tôi không thấy cách phân biệt các khách hàng khác nhau. Và nó không cung cấp một cách để chờ đợi dữ liệu từ nhiều kết nối với một cái gì đó như chọn.

Câu hỏi cũ nói về việc sử dụng các đường ống có tên, nhưng nó không giải thích cách sử dụng các đường ống có tên để có được hành vi mong muốn. AF_UNIX in windows
Tôi không thấy cách xử lý một khách hàng cụ thể.

Trả lời

1

Tôi đã tìm thấy câu trả lời.

Sự khác biệt lớn nhất là việc xử lý việc chờ kết nối giống với giao tiếp với khách hàng. Tôi sẽ phải tạo một đường ống mới có tên cho máy chủ để đợi cho máy khách tiếp theo.

Tài liệu tham khảo:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365799%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365588%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365603%28v=vs.85%29.aspx

1

Có lẽ không phải là câu trả lời bạn muốn nghe, nhưng COM là một trong nhiều cơ chế tiêu chuẩn để đạt được liên lạc liên tiến trình trong Windows. Nó có vấn đề mà làm phiền các nhà phát triển - nhưng nó hoạt động khá tốt cho tất cả các yêu cầu bạn liệt kê.

Đối với ổ cắm IP, bạn đã đề cập đến vấn đề "có thể thấy trong mạng". Đây không phải là trường hợp nếu bạn chỉ đơn giản là ràng buộc ổ cắm máy chủ của bạn đến địa chỉ localhost (127.0.0.1).

SOCKET s; 
const DWORD LOCAL_HOST_IP = 0x7f000001; // 127.0.0.1 
sockaddr_in addrLocal = {}; 

s = socket(AF_INET, SOCK_STREAM, 0); 
addrLocal.sin_family = AF_INET; 
addrLocal.sin_port = htons(YOUR_APPLICATION_PORT); 
addrLocal.sin_addr.s_addr = htonl(LOCAL_HOST_IP); 
s = SOCKET(AF_INET, SOCK_STREAM, 0); 
bind(s, (sockadr*)&addrLocal, sizeof(addrLocal)); 
0

Windows có thời gian gần đây (Windows 10 Insider xây dựng 17.063) thực hiện hỗ trợ cho AF_UNIX, vì vậy bạn có thể sử dụng nó trong cửa sổ tương lai xây dựng.

Tuy nhiên, không phải tất cả đều được triển khai, các tính năng bên dưới không hoạt động.

  • AF_UNIX datagram (SOCK_DGRAM) hoặc gói chụp liên tục (SOCK_SEQPACKET) loại socket.
  • Dữ liệu phụ trợ: Triển khai ổ cắm unix của Linux hỗ trợ truyền dữ liệu phụ như truyền mô tả tệp (SCM_RIGHTS) hoặc thông tin xác thực ('SCM_CREDENTIALS`) qua ổ cắm. Không có hỗ trợ cho dữ liệu phụ trợ trong việc triển khai ổ cắm Windows unix.
  • Tính năng tự động liên kết (xem phần ‘sockaddr_un’ để biết chi tiết).
  • socketpair: socketpair socket API không được hỗ trợ trong Winsock 2.0.

Nguồn: https://blogs.msdn.microsoft.com/commandline/2017/12/19/af_unix-comes-to-windows/