簡體   English   中英

如何從套接字錯誤中恢復? (10040)

[英]How do I recover from a socket error? (10040)

我有一個 UDP 發送者和一個 UDP 偵聽器。 傳輸消息效果很好。 但...

當我過度喂食(快速發送持續數據)時,偵聽套接字可能會拋出對 ReceiveFrom 的調用,錯誤代碼為 10040,這意味着某些緩沖區不夠大。 異常消息是

在數據報套接字上發送的消息大於內部消息緩沖區或某些其他網絡限制,或者用於接收數據報的緩沖區小於數據報本身。

很公平。 但問題是我會在每次調用 ReceiveFrom 時得到這個異常。 插座似乎壞了。 我願意接受傳輸失敗,但我現在想刷新套接字的接收緩沖區並繼續。

我可以通過在偵聽套接字上設置 128K 的大量接收緩沖區大小(而不是默認的 8K)來防止這種情況發生。 我還可以通過在發送多塊批量消息的 65507 字節塊后讓發件人暫停 1 毫秒來修復它。

但我沒有安全感。 如果這個異常仍然發生,我想記錄並繼續(下次運氣更好)。 重新創建套接字並重新啟動偵聽線程似乎很生硬。 有沒有更好的辦法?

我不喜歡不相關的東西: Socket.ReceiveFrom 在超時后拋出異常。 這很愚蠢,超時是正常行為。 我希望有一個 TryReceiveFrom 方法,我不喜歡將異常處理程序用作流控制語句,這似乎是我唯一的選擇。 有沒有更好的辦法?

我現在接受,當緩沖區溢出時,套接字已損壞並且需要重新創建。

可以通過首先使用Socket.Poll方法檢查是否有任何數據可用來防止Socket.ReceiveFrom超時后引發的異常。 這有自己的超時參數。 因此,在套接字上設置ReceiveTimeout是沒有意義的,將PollReceiveFrom結合使用會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM