关于Socket通讯报错“由于系统缓冲区或队列已满,不能执行套接字上的操作”,如何解决

harvesthouhao 2007-04-05 06:05:25
在连续不断发送一个较大的文件时出现的。(文件分块循环发送)
...全文
7471 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
msyang 2011-10-13
  • 打赏
  • 举报
回复
从楼猪发帖的这种方式看,就能大致估计出是个没有教养的东西。
msyang 2011-10-13
  • 打赏
  • 举报
回复
这个帖子过去很久了,还是有兴趣说两句。

其实mygod_good的表现很不错了。

前面打了很多字,语气也很友好,并且提到了在另一个帖子已经给了解答了。

可是楼猪这个东西,显然没有领会到mygod_good的回复,没有自己去思考,肯定也没有对mygod_good表示感谢。
这个饭来伸手之徒,于是又发了一个帖子。

mygod_good可以说还是一个有热心肠的人,
真正可恨的是楼猪这种东西。
joey_GC 2011-08-11
  • 打赏
  • 举报
回复
学习了
yunvih_2009 2011-03-02
  • 打赏
  • 举报
回复
mygod_good说话直,其他人就不明白是在做什么了,打抱不平?跟风?
orc_chan 2010-12-23
  • 打赏
  • 举报
回复
mygod_good, 你免杀做得怎么样?有空探讨探讨!
「已注销」 2010-09-04
  • 打赏
  • 举报
回复
另外补充一点 mygod_good 的解答其实很到位的 也很详细, 如果说他傲慢的话还是反省下自己是不是不够谦虚, 看看自己说的那些话吧 虽然说谁都有新手的时候 但也没有像这么大爷一样的问问题的
「已注销」 2010-09-04
  • 打赏
  • 举报
回复
我觉得mygod_good没有错 而且他帮助别人 到最后反倒落一堆骂名 我觉得挺不可思议的 所以我也不大喜欢那些新手 特别是不逊的新手 帮忙回答问题还得跟个孙子一样伺候 真是操蛋!
铛铛 2010-08-20
  • 打赏
  • 举报
回复
见到mygod_good这种人我最火大了
loverjohn 2010-01-13
  • 打赏
  • 举报
回复
你这个问题或许是由于对方服务器导致的 所以也许和你缓冲区一点关系也没有
tyluomu 2009-12-25
  • 打赏
  • 举报
回复
mygod_good(菜鸟之非常菜),你不要说C#的socket不行,c#socket优秀的案例可能只是你没有看过而已。
c#基于.netframework只不过被微软封装了很多功能而已,我相信微软写的代码比你写的好一些。如果我没有看错的话,mssql2005应该是基于.netframework开发的。
纯属为了扯淡 2009-11-17
  • 打赏
  • 举报
回复
mygod_good 值得鄙视,不懂装懂的家伙。我来说两句:

异步socket底层的机制其实用的是iocp的原理,至于原理是什么就不多说了,只是iocp内部的内核队列和线程池机制大家都应该知道,一个socket发送或者接受的时候使用到了线程池,那么就意外着对socket内部缓冲区的访问是线程争用的,我们需要对缓冲区进行同步,当然这是操作系统帮我们完成的了。但是,由于.net的托管性质和GC的影响,socket的缓冲区也是放在堆上的,所以GC可能会回收或者移动缓冲区,而在异步发送和接受BeginXXXX方法的时候用的是底层的iocp线程池机制,所以为了保护该缓冲区,.NEt采用了一种机制“Pinned”内存,被标注为“Pinned”的内存是不能够被回收和移动的,但是,如果异步发送或者接受的速度过快,就会造成堆中有很多的被“Pinned”的内存小块,这时候可以说是形成了堆碎片,由于这些小内存块的不可移动性,导致了现在的堆无法分配出较大的内存块,所以在某些情况下就会出现堆内存溢出,也就是楼主说的问题了,这是net2.0的一个问题,3.5已经改进了异步APM的模型了,性能也更好了,至于楼主说的问题可以采用预先分配的缓冲区池来解决,具体MSDN上面有,搜索一下,这里推荐一篇:http://blogs.msdn.com/tess/archive/2006/09/06/742568.aspx
mygod_good 2007-04-08
  • 打赏
  • 举报
回复
令你失望了,我不是什么学生,我也只是个业余爱好者。至于社会上我混不混得好,我有车也有房,家里有一点钱,我不需要工作,我喜欢去研究一些让我高兴的东西。至于你说社会上混得好什么概念,说实话如果混的好的就不会在这里了,更不会说什么来这里混个星星也挺好了,哈哈。
harvesthouhao 2007-04-08
  • 打赏
  • 举报
回复
做人要谦虚,这是中华民族的美德。虽然我们对某些问题不太了解。才来这里虚心请教。但你为何要这样傲慢。我也最看不起这种人了。就算你的本事很高。技术很硬。最后混到没人理你。你活着还有意思嘛。。。。相信你平时一定没有什么朋友。算了,不说了,自己好自为之吧。。结贴了。。
mygod_good 2007-04-08
  • 打赏
  • 举报
回复
你说一点也没错,我家也有茅房和自行车。
SZY_JZM 2007-04-08
  • 打赏
  • 举报
回复
至于社会上我混不混得好,我有车也有房,家里有一点钱
---------------------------------××××
×××
你是茅房和自行车吧,呵呵,BS

说话看不起人和很傲气得人,我最看不起他
全国人民严重BS mygod_good(菜鸟之非常菜)
dazhu2 2007-04-08
  • 打赏
  • 举报
回复
人无论在什么时候都应该谦虚一点,说话不要有傲气,否则没有人会看得起你
mygod_good 2007-04-07
  • 打赏
  • 举报
回复
我的上帝,你留下你的联系方式吧,在具体讨论吧
harvesthouhao 2007-04-07
  • 打赏
  • 举报
回复
可我想问的是,将自定义缓冲区分别设置为1024*8和1024*64时,在局域网中,实地测试。就是1024*64快于1024*8。还有一点,请问,如果不修改SOCKET的默认缓冲区,为何在异步循环调用beginsend时,只要发送100M以上的文件,过一会儿就会出现“系统缓冲区空间不足或队列已满,不能执行套接字上的操作”的错误。难道socket的sendbuffersize不会在每次调用endsend后,清除本次的缓冲区内容吗?因为我是分块读取文件,然后发送。所以就要循环调用beginsend异步发送来发送文件。而且我也在发送下面加上了done.waitone,以及在回调后加上了done.set(),可是每次还是报这个错误,到底怎么回事?大概发送代码如下:
do
{
socket.beginsend(); //这里报错
done.waitone();
}
while()

pravie void sendcallback()
{
done.set();
}

如何解决报错问题?
mygod_good 2007-04-07
  • 打赏
  • 举报
回复
1:关于楼主的问题,我如此耐心的告诉你答案以及本身造成这个问题的原因,你却如此。
2:我就说了,C#版都是垃圾,还不信,看到有什么星星来批判我,就跟着说。哎,悲哀
harvesthouhao 2007-04-07
  • 打赏
  • 举报
回复
支持dazhu2。。。继续BS mygod_good(菜鸟之非常菜)
加载更多回复(21)

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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