2009-02-10 27 views
5

Tôi cần phải xác định liệu một mã mà mã của tôi không tạo ra, trong đó GetFileType()==FILE_TYPE_PIPE, có phải là ổ cắm hay không. Có vẻ như không phải là một API cho việc này.Làm cách nào để phân biệt tay cầm socket Win32 với các tay cầm ống khác?

Tôi đã thử cách sau. Ý tưởng chung là sử dụng một chức năng socket cụ thể và điều trị thất bại như là không có nghĩa là ổ cắm.

  • getsockopt() - Đây là lần thử đầu tiên của tôi. Thật không may nó dường như treo khi được gọi bởi nhiều chủ đề trên cùng một (non-socket) xử lý.
  • WSAEnumNetworkEvents() - đây là những gì Gnulib làm nhưng sẽ có tác dụng phụ không mong muốn nếu tay cầm ổ cắm.
  • getpeername() - đây là những gì Cygwin thực hiện nhưng điều này cũng sẽ không thành công đối với một số ổ cắm. Đoán xem một lỗi ngụ ý socket-ness có vẻ không đáng tin cậy và an toàn trong tương lai hay không.

Tôi không quan tâm nếu giải pháp chỉ hoạt động trên một số phiên bản của Windows, ví dụ: Vista, tôi luôn có thể quay trở lại một số phương pháp khác trong trường hợp chung.

Trả lời

1

Bạn đã thử WSADuplicateSocket. Sau đó, chỉ cần kiểm tra WSAPROTOCOL_INFO để xem liệu đó có phải là một ống được đặt tên ...

+0

No. Tôi sẽ cố gắng, cảm ơn. –

2

Tôi nghĩ rằng có lẽ bạn có thể tìm cách gọi GetNamedPipeInfo() trên tay cầm của bạn. Nếu cuộc gọi thành công bạn biết rằng tay cầm là một tay cầm ống, nếu không nó phải là một ổ cắm.

+0

Cảm ơn. Điều này có thể an toàn hơn so với sử dụng các chức năng của ổ cắm cụ thể (đã được biết là treo cho các ổ cắm không). –

0

Bạn cũng có thể sử dụng GetNamedPipeHandleState(), đánh giá kết quả bằng GetLastError().

Các vấn đề liên quan