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;
}