2010-07-30 59 views
2

我已閱讀MSDN上Winsock2的文檔,但如果有人能幫忙,我仍需要澄清幾件事情。C++ Winsock 2個問題

我打算做一些類似於使用WSAAsyncSelect()時得到的設置,但使用單獨的線程。我可以使用WSAEventSelect()將多個套接字鏈接到單個事件對象嗎?

如果我使用了一個完成端口,我可以通過完成端口獲得哪些事件? MSDN在文件操作方面有一個列表,但我無法通過完成端口發送哪些事件(FD_READ,FD_WRITE,等等)。有沒有辦法分辨哪個事件正在完成?或者我必須記下這一點,並在每次發送或接收某些內容時將其存儲在結構中?

感謝任何*幫助任何人都可以給我這個= d

編輯:更好的是,我會更好只是切換到C#這樣做嗎?它似乎非常受歡迎,更適合這一特定任務。

+0

我通常只使用像select()這樣的POSIX函數,而不是花哨的Winsock函數。他們似乎行得通。 – 2010-07-30 18:48:35

回答

1

不,你不能鏈接多個套接字到單個WSAEVENT。您必須爲每個您希望接收通知的套接字調用WSACreateEvent()和WSAEventSelect()。不過,您可以使用WSAWaitForMultipleEvents()讓單個線程等待來自多個套接字的事件。

至於使用完成端口,我建議你閱讀MSDN的關於此事的文章,如:

Windows Sockets 2.0: Write Scalable Winsock Apps Using Completion Ports

+0

當時我沒有完全理解完成端口..但是我已經完成了相當多的主題閱讀,現在,我的當前配置根本不需要任何事件對象。我不知道AcceptEx()會觸發完成端口..這幾乎解決了我的問題。謝謝 – bitwise 2010-08-05 22:20:32

1

[免責聲明:我和socket編程非常有限的經驗。]

我計劃做類似的 你設置當您使用 WSAAsyncSelect(),但使用一個單獨的線程 。我可以使用WSAEventSelect()來將 多個套接字連接到單個的 事件對象嗎?

這沒有任何意義。一個事件只能發信號一次。所以如果你有多個套接字連接到同一事件,那麼當它發出信號時,你永遠不會知道哪個套接字發信號通知事件!

你可以做的是創造每一個套接字的事件(每插槽可能是多個事件:對你感興趣的每FD_ *事件),並使用WSAWaitForMultipleEvents(http://msdn.microsoft.com/en-us/library/ms742219%28v=VS.85%29.aspx

+0

這是我困惑的地方。如果你所說的是真的,那麼如果一個套接字在一行中有兩個讀事件會發生什麼?那麼API會不會等待WSAEnumNetworkEvents()被調用來在重新發送信號之前重置事件? – bitwise 2010-07-30 22:00:40

+0

我不知道。我不希望API太聰明瞭。也就是說,我完全期望這個活動只能設置一次。 – 2010-08-02 15:12:46