簡體   English   中英

10038套接字錯誤

[英]10038 socket error

10038服務器錯誤是否有任何解決方案.i已在c ++中完成編碼; 服務器運行良好10到12小時,但很容易出現10038套接字錯誤

沒有看到你的代碼:你描述的症狀聽起來像你正在泄漏內存/資源,即你忘記釋放/刪除你正在分配的對象。 這也可能是一個時間問題。 我建議你發布你的(縮減)代碼。

10038(WSAENOTSOCK):非插槽上的套接字操作。 嘗試對不是套接字的操作進行操作。 套接字句柄參數未引用有效套接字,或者對於select,fd_set的成員無效。

我打賭你正在訪問已經關閉的套接字。 這是WinSock編程中一個非常常見的時間錯誤 - 好消息(和壞消息,因為它很難重現)是你不經常打它,所以你的代碼可能不需要太多的工作來完善它。 我認為你應該添加線程安全的診斷,在每次打開和關閉時,以及從你看到10038或其他意外錯誤的任何地方輸出包含套接字值(基本上是int )的字符串。

如果你可以添加這些診斷,然后設置一個壓力測試,專注於程序中的打開和關閉區域(你可能需要將代碼拆分為一個小的子集,用於單元測試套接字處理,也許這樣做可以回到 - 在本地主機或兩台連接局域網的機器上然后它可能會比10-12小時更快地顯示,你可以找到並修復其他時間窗口。 目標是嘗試將10-12小時的“正常”套接字活動壓縮到盡可能小的時間空間,以真正暴露任何難以檢測的並發問題。

這可能有兩個原因:

  1. 您的套接字描述符未初始化(即不引用有效的套接字)。
  2. 你關閉了這個套接字(通過調用closesocket ),仍然嘗試使用它。

這樣的錯誤總是一個錯誤 ,它與真實的網絡活動/狀態等無關。這在某種意義上是等同於在釋放資源/內存之后嘗試使用資源/內存,或者只是引用未初始化的指針。

因此,為了解決10038,您必須修復代碼。

PS如果你有一個多線程應用程序 - 很可能你在一個線程中關閉套接字,而另一個線程仍然試圖使用它。

無論如何,在開頭將套接字描述符初始化為INVALID_SOCKET是一個很好的做法。 關閉后立即將其設置為INVALID_SOCKET

然后,在嘗試使用它之前,您可以檢查套接字是否有效。 通過這種方式,您可能會發現有問題的情況。

還要注意這樣的事實 - 至少在Windows中 - 如果你嘗試在一個在不同線程中打開的線程上發送套接字,你將得到10038。

暫無
暫無

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

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