我第1次wsarecv就收到WSAENOBUFS错误是什么原因呢

downmooner 2011-07-05 05:27:36
WSAENOBUFS
10055
No buffer space available.
An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.


连接上来 第1次调用wsarecv
	WSABUF  wbuf;
DWORD bytes,flags;
int rc;
ZeroMemory(&(m_recvobjx.ol),sizeof(WSAOVERLAPPED));
m_recvobjx.wbuf.buf = m_chrecvbuff + m_uirecved;
m_recvobjx.wbuf.len = m_uirecvbufflen - m_uirecved;

flags = 0;

rc = WSARecv(
m_ssocket,
&wbuf,
1,
&bytes,
&flags,
&m_recvobjx.ol,
NULL
);

if (rc == SOCKET_ERROR)
{
if (WSAGetLastError() != WSA_IO_PENDING)
{
cout<<"PostRecv: WSARecv* failed! :"<<WSAGetLastError()<<endl;
return false;
}
}


得到的错误就是10055
...全文
182 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
downmooner 2011-07-05
  • 打赏
  • 举报
回复
=。=不好意思。。我好像是代码写错了

。。。m_recvobjx.wbuf。
downmooner 2011-07-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 visualeleven 的回复:]

引用 3 楼 visualeleven 的回复:
m_recvobjx.wbuf.buf = m_chrecvbuff + m_uirecved;
-----------------------------
这里的m_chrecvbuff怎么定义的,m_uirecved又是多少?m_recvobjx.wbuf.buf指向哪里呢?

还有这里的
m_recvobjx.wbuf.len ……
[/Quote]

m_uirecved 这个是缓冲区还有的数据长度.m_uirecvbufflen是缓冲区整个的长度
downmooner 2011-07-05
  • 打赏
  • 举报
回复
如果各位原意麻烦的话。http://code.google.com/p/xhblib/source/browse/#svn%2Ftrunk%2Flibx_%253Fstate%253Dclosed
有我整个工程。。
Eleven 2011-07-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 visualeleven 的回复:]
m_recvobjx.wbuf.buf = m_chrecvbuff + m_uirecved;
-----------------------------
这里的m_chrecvbuff怎么定义的,m_uirecved又是多少?m_recvobjx.wbuf.buf指向哪里呢?
[/Quote]
还有这里的
m_recvobjx.wbuf.len = m_uirecvbufflen - m_uirecved;
的长度是多少呢?
downmooner 2011-07-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 visualeleven 的回复:]

m_recvobjx.wbuf.buf = m_chrecvbuff + m_uirecved;
-----------------------------
这里的m_chrecvbuff怎么定义的,m_uirecved又是多少?m_recvobjx.wbuf.buf指向哪里呢?
[/Quote]

m_chrecvbuff 是连接建立时分配的一个缓冲区
downmooner 2011-07-05
  • 打赏
  • 举报
回复
试过监听低端口,这个貌似不是问题所在
Eleven 2011-07-05
  • 打赏
  • 举报
回复
m_recvobjx.wbuf.buf = m_chrecvbuff + m_uirecved;
-----------------------------
这里的m_chrecvbuff怎么定义的,m_uirecved又是多少?m_recvobjx.wbuf.buf指向哪里呢?
Eleven 2011-07-05
  • 打赏
  • 举报
回复
typedef struct __WSABUF 
{
u_long len;
char FAR* buf;
}
WSABUF, *LPWSABUF;

c_losed 2011-07-05
  • 打赏
  • 举报
回复
由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作。

来自微软帮助: http://support.microsoft.com/kb/196271

如果您尝试建立 TCP 连接从大于 5000 的端口,本地计算机将响应以下 WSAENOBUFS (10055) 错误消息:
由于系统缺少缓冲区空间不足或队列已满,无法执行套接字上的操作。

默认最大的临时 TCP 端口的数是 5000 。 要提高临时端口的上限,请按照下列步骤操作:
启动注册表编辑器。
在的注册表中找到以下子项,然后单击 参数 :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
在 编辑 菜单上单击 新建 ,然后添加下面的注册表项:
数值名称: MaxUserPort
值类型: DWORD
值数据: 65534
有效范围: 5000-65534 (十进制)
默认值: 0x1388 (5000 十进制)
说明: 此参数将控制程序从系统请求任何可用的用户端口时使用的最大端口数。 通常,1024 的值和包含的 5000 之间分配临时的 (短) 端口。
退出注册表编辑器,并重新启动计算机。
请注意 其他的 TCPTimedWaitDelay 注册表参数确定在多长时间关闭的端口等可重复使用已关闭的端口。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧