2013-03-15 128 views
0

我從這個thread使用SocketClient.cs和msdn非常相似。UDP空緩衝區ReceiveAsync

有人可以告訴我爲什麼收到數據包後緩衝區爲空?

我有Windows 8上的主機應用程序,然後我從手機數據包發送某種信息。然後主機用新數據包回覆我。方法'接收'收到空的信息。緩衝區是空的。如何解決這個問題?

回答

0

如果您沒有對SAEA對象的Completed事件作出反應,則沒有收到任何數據。如果你是,那麼你收到一條空的消息或者你的緩衝區大小是0.這是文檔告訴你的。

我查看了鏈接中的代碼,發現它使用的是帶有SendToAsync方法的ManualResetEvent。我不知道它爲什麼這樣做,但這可能是一個原因,具體取決於指定的超時時間。

我想不是每個人都在閱讀SAEA對象的文檔,但是您必須將其視爲線程同步對象。它被髮送到一個線程,在那裏完成它的工作並完成信號,就是這樣。也許這是鏈接文章中代碼的問題,應該從SAEA對象接收信號的線程正忙於調用Reset方法。如果是這樣,沒有來自在另一個線程中工作的SAEA對象的事件正在通過。

另請注意,如果結果在調用時可用,則SendToAsync可能會立即返回false。您可以立即檢查結果。所以,你會安全地調用它像

if (!_socket.SendToAsync(myEventArgs)) 
    ProcessResult(myEventArgs); 

所以其基本思路是:如果你使用的SocketAsyncEventArgs,不使用線程。 Async套接字方法嘗試使線程對用戶透明,並且您只需在其上添加線程層。這很可能會讓你陷入困境。