A. Windows socket error: 由於系統緩存區空間不足或列隊已滿,不能執行套接字上的操作。(10055),on API'
10055錯誤是系統隊列或緩沖區滿,與socket句柄的多少無關。可能是由於你開的線程太多,代碼又不夠優化,導致系統資源耗盡而引起的。
發送的速度太快,使協議棧的緩沖區滿.
發慢一點嗎!
當然,可能是緩沖被設得太小了
B. windows socket error:由於系統緩沖區空間不足,阻止以上的操作。(10055) on API'connect,
1、虛擬內存太小或者C盤滿了。如果是這種,請自己查資料加大虛擬內存量,並保證C盤還有充足的空間。
2、是你電腦裡面某個軟體的問題。
這個錯誤可能是你計算機的Socket句柄資源用盡導致的,能夠造成這種現象的一種情況就是你的計算機的某個程序不斷的向某個連接發出連接申請,但是始終沒能連上,沒連上就會引發一個錯誤,如果編程的人沒有寫釋放資源的代碼,那麼這個連接就始終占據著著一個句柄,於是由於不斷的連接,最終導致Socket句柄資源耗盡。
如果你運行的都是很正常的程序,那麼很可能進行連接的就是一些木馬程序,比如盜取密碼的程序需要將盜取的密碼發送到某台機器上等等。如果殺毒沒殺到,就裝個防火牆看看,追求乾脆的話就重新安裝系統。
3、注冊表中的以下二項出現錯誤
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Winsock
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Winsock2
解決辦法:備份,然後找一台相同系統的機器,將以下注冊表分支導出存為二個文件,
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Winsock
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Winsock2
最後將這二個導出的注冊表文件導入到有問題的機器中即可。
C. 系統緩沖空間不足或列隊已滿是什麼意思,怎麼解決
由於系統緩沖區空間不足或隊列已滿的解決方法
windows socket error: 由於系統緩沖區空間不足或隊列已滿,不能執行套接字上的操作(10055),on API connect
解決方法:
1、重啟電腦,最簡單方法。
2、虛擬內存太小或者C盤滿了。如果是這種,請加大虛擬內存量,並保證C盤還有充足的空間。
如果是這種,右鍵單擊我的電腦——>屬性——>高級——>性能設置——>高級——>將虛擬內存的值加大。
3、開始-運行依次輸入以下命令,輸完這些命令後重新啟動windows,然後打開IE看看。
regsvr32 Shdocvw.dll
regsvr32 Shell32.dll
regsvr32 Oleaut32.dll
regsvr32 Actxprxy.dll
regsvr32 Mshtml.dll
regsvr32 Urlmon.dll
4、是你電腦裡面某個軟體的問題。
這個錯誤可能是你計算機的Socket句柄資源用盡導致的,能夠造成這種現象的一種情況就是你的計算機的某個程序不斷的向某個連接發出連接申請,但是始終沒能連上,沒連上就會引發一個錯誤,如果軟體編程的人沒有寫釋放資源的代碼,那麼這個連接就始終占據著著一個句柄,於是由於不斷的連接,最終導致 Socket句柄資源耗盡。
5、注冊表中的以下二項出現錯誤
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Winsock
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Winsock2
解決辦法:備份,然後找一台相同系統的機器,將以下注冊表分支導出存為二個文件,
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Winsock
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Winsock2
最後將這二個導出的注冊表文件導入到有問題的機器中即可。
6、運行Hijackthis,選擇do a system Scan only,在下列選項前打上勾,然後關閉其他程序和IE窗口,點「Fix Checked」,出現提示時一路點「是」讓它繼續:
O23 - Service: IEXPLORER - Unknown - C:\WINNT\IEXPLORER.exe 灰鴿子
重啟電腦按F8進安全模式,打開我的電腦 工具 文件夾選項 查看 設置windows顯示所有隱藏文件、受保護的系統文件和文件夾,然後手動刪除:C:\WINNT\IEXPLORER.exe 及同一時間生成的.DLL文件。
D. 如何得知socket的緩存大小,這個緩存是否有上限,是否會溢出
一:如何得知socket的緩沖大小?
通過socket選項可以獲得socket的緩沖大小。(以下是python代碼,sock為socket對象)
sock.getsockopt(SOL_SOCKET,SO_RCVBUF):獲取接收緩沖區的大小
sock.getsockopt(SOL_SOCKET,SO_SNDBUF):獲得發送緩沖區的大小
註:UDP協議在內核實現中沒有發送緩沖區。
二:這個緩沖是否有上限?
緩沖區存在上限,沒一個socket對象的緩沖區有上限,系統中所有的socket緩沖區的總大小也存在上限。
三:是否會溢出?
TCP協議是可靠的有序的位元組流協議,其可靠性與接收端的滑動窗口機制有關,而滑動窗口和TCP的接收緩沖區有關。
TCP協議的緩沖區不會溢出,如果接收緩沖區已滿,則通告窗口為0,不能在接收發送端發過來的數據。如果發送緩沖區已滿(則可以說明對端的接收緩沖區一定已滿),應用層的send調用阻塞(採用阻塞式IO)。所以說TCP協議的緩沖區不會溢出。
UDP協議的緩沖區會溢出,UDP協議在實現上沒有發送緩沖區,接收緩沖區存在上限,當UDP的接收緩沖區達到上限時,以後接收到的數據報直接丟棄,這也是UDP協議不可靠的一個原因。
-----------------------------------------------------------------------------------------------------------
推薦你看一下陶輝的」高性能網路編程「系列,肯定會受益匪淺。
E. windows 環境下socket編程可以改變buffer size嗎
// 這段代碼是改變接系統接收緩沖區大小。每次可以從另一端接收數據大小變大。
int nBufLen;
int nOptlLen;
nErrCode = getsockopt(s, SOL_SOCKET, SO_RCVBUF, (char*)nBufLen, &nOptlLen);
if (SOCKET_ERROR == nErrCode)
{
return EXIT_FAILURE;
}
nBufLen *= 10;
nErrCode = setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char*)&nBufLen, nOptlLen);
if (SOCKET_ERROR == nErrCode)
{
return EXIT_FAILURE;
}
// 檢查設置系統接收數據緩沖區是否成功
int uiNewRcvBuf;
int nOptLen;
getsockopt(s, SOL_SOCKET, SO_RCVBUF, (char*)uiNewRcvBuf, &nOptLen);
if (SOCKET_ERROR == nErrCode || uiNewRcvBuf != nBufLen)
{
return EXIT_FAILURE;
}
// 這一段,是更改發送緩沖區大小,使我們每次可以發送比較大的數據。
unsigned int uiOldSize = 0;
unsigned int uiNewSize = 0;
int uiRcvBufLen = 0;
if((uiOldSize = GetSysBuffSize(inSocket)) == 0)
{
// 獲取緩沖大小失敗
return false;
}
uiRcvBufLen = sizeof(uiBuffSize);
if (SOCKET_ERROR == setsockopt(inSocket, SOL_SOCKET, SO_SNDBUF, (char*)&uiBuffSize, uiRcvBufLen))
{
// 修改系統緩沖區大小失敗
return false;
}
// 檢查設置系統發送緩沖區是否成功
uiRcvBufLen = sizeof(uiNewSize);
if (SOCKET_ERROR == getsockopt(inSocket, SOL_SOCKET, SO_SNDBUF, (char*) &uiNewSize, &uiRcvBufLen) || uiNewSize == uiOldSize)
{
// 修改系統發送緩沖區失敗
return false;
}