我想爲我的XNA-Networkgame使用UDP-Sockets。 現在我試圖編寫一個可靠的Listenerthread,但有一些問題。C#:UDP偵聽線程
如果我使用socket.Receive它將等待一個包。這對我的Listenerthread來說很好。 我的線程有一個while循環是這樣的:
while(Listen == true)
{
socket.Receive(...);
}
但是,如果我換了監聽標誌設置爲false(如果我想停止聽),它會停留在最後.Receive()。
然後我看着Methodes .BeginReceive()。如果數據包到達,它將調用一個方法。 但是爲了接收數據,我必須使用.EndReceive(),這是我遇到的問題。我還想監聽數據包,如果數據包到達,不要停止監聽。
所以我仍然使用帶有「.Receive()」的阻止版本。我可以通過調用Thread.abort()來強制取消偵聽線程,但這並不好。
目前我測試數據是否可用:
while(Listen == true)
{
if(socket.Available > 0)
{
socket.Receive(...);
}
}
但我認爲這不是最好的辦法...如果 - 子句的其他線程調用socket.Receive(後不久,如果.. )它將再次陷入無意中。 有沒有辦法取消.Receive(..)方法? 我試圖設置超時,但如果.Receive超時,它會拋出一個異常...
我想要一個簡單的udp-listening-thread,我可以優雅地停下來。 :-) 在MSDN中,我沒有找到一個正在偵聽多個數據包的偵聽器示例。 如何處理其他程序員呢?
「如果其他線程調用socket.Receive(..)的if子句後不久,」 - 這似乎暗示有多個線程從同一插座讀書? – Ragoczy 2010-09-02 13:17:41
不,我不這樣做。 但它是可能的,我想避免:-) – user437899 2010-09-02 13:28:25
當你準備好停止收聽時,關閉插座。阻塞'Receive()'方法將以'SocketException'退出,您需要捕獲它。 – 2010-09-02 13:47:48