• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

socket 异步报缓冲区不足或队列已满

weixin_40125664 ppp 2020-12-24 03:34:21
今天做了个测试,用tcp客户端连接到tcp调试助手,采用异步连接,用task启动一个线程,每次发10000个byte,异步发送。一会儿程序就 报报缓存或队列以满,不知道什么情况?请大神指导一下
...全文
2231 点赞 收藏 19
写回复
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_40125664 2020-12-25
引用 10 楼 ziqi0716的回复:
[quote=引用 6 楼 weixin_40125664 的回复:][quote=引用 2 楼 ziqi0716的回复:]你拿消防栓开到最大,往你车油箱里面灌水,还问怎么回事?
我就是不太懂才发貼子问问,你何必怼我呢?而且我的程序真实情况就是不断的接收数据,然后发数据。现在只是全用异步,我就想看看是个什么效果,结果出现这个情况,就懵逼了。[/quote] 不好意思啊,无意怼你,本来想幽默一把的,语气不太对[/quote] 没关系,感谢你关心,因为程序有问题但有不知道该怎么透过现象去处理,很着急。不知道你对网络数据处理怎么样?我说个需求,你看看如果你做,你会怎么处理。1.我的程序是wiform的,既做服务端又做客户端,用tcp,服务端时要不端的接收设备发出的数据,数据量反正不小。解到一个数据类型匹配的包,就要用客户端把包发给大容量存储
回复
weixin_40125664 2020-12-25
引用 9 楼 ziqi0716的回复:
[quote=引用 5 楼 weixin_40125664 的回复:][quote=引用 2 楼 ziqi0716的回复:]你拿消防栓开到最大,往你车油箱里面灌水,还问怎么回事?
那您觉得我因该怎么测试合理?[/quote] 你画个流程图,看看你的逻辑是否正确. .net提供了很多方法来读写io数据,但不同通讯协议需要使用不同的方法调用. 另外,你的程序不应该"不断的接收数据和发送数据",这个是不对的,一定是逻辑有问题,或者是你想偷懒而做出的妥协,这种妥协通常在后来都会推翻重来的. 画个流程图吧,然后解释给别人听,如果你自己觉得逻辑严谨,有理有据,然后再写代码,也不迟.[/quote] 我也是拿其它人的项目写过的代码而且也是交付过,拿出来实验一下客户端异步发送的效果。因为我现在的项目也有这个场景,我把数据不断的发出去,不知道对方是不是收慢还是什么原因,一会儿我对程序就被堵了,都收不了数据了。我只要停止给对方发数据,我接收端又能收数据了,你能帮我分析一下吗?
回复
wanghui0380 2020-12-25
引用 11 楼 weixin_40125664 的回复:
[quote=引用 3 楼 wanghui0380的回复:]关键代码,发出来 _session.ClientSocket 我想知道这个的实现
就是有个类名就session,里面有个属性 clientSocket,返回一个socket[/quote] 额,这代码很宝贵么,贴出来把。我前面那么说,自然是我有理由怀疑你这代码的问题。我需要看你的实现以验证猜想
回复
weixin_40125664 2020-12-25
引用 7 楼 第27个Bug的回复:
首先,你的程序运行的时候是这样子的

while (true)
    test.SendTest(b);//一直执行发送  
Thread.Sleep(100);//无法访问的代码  (这行代码永远无法执行)
一直执行的发送会写入大量发送的数据,IO处理没程序的快,就挂了呗。
我不知道tcp调试助手是不是把收到的数据一直留着还是显示完了就完了。我现在改了一下程序,用代码写服务端,把数据放在listbox里显示,没有清出,一会也挂了,我又改了一下,到1000就清除listbox, 客户端用定时器发数据100毫秒一次就不挂了。只能猜是tcp助手没有清数据
回复
weixin_40125664 2020-12-25
引用 1 楼 信仰诠释过往的回复:
关键在于 whlie(true) 一直在发送的死循环
这个也是业务需求就是这样的,只要设备不关,就会一直发给我,这个场景也很正常啊!
回复
weixin_40125664 2020-12-25
引用 3 楼 wanghui0380的回复:
关键代码,发出来 _session.ClientSocket 我想知道这个的实现
就是有个类名就session,里面有个属性 clientSocket,返回一个socket
回复
ziqi0716 2020-12-25
引用 6 楼 weixin_40125664 的回复:
[quote=引用 2 楼 ziqi0716的回复:]你拿消防栓开到最大,往你车油箱里面灌水,还问怎么回事?
我就是不太懂才发貼子问问,你何必怼我呢?而且我的程序真实情况就是不断的接收数据,然后发数据。现在只是全用异步,我就想看看是个什么效果,结果出现这个情况,就懵逼了。[/quote] 不好意思啊,无意怼你,本来想幽默一把的,语气不太对
回复
ziqi0716 2020-12-25
引用 5 楼 weixin_40125664 的回复:
[quote=引用 2 楼 ziqi0716的回复:]你拿消防栓开到最大,往你车油箱里面灌水,还问怎么回事?
那您觉得我因该怎么测试合理?[/quote] 你画个流程图,看看你的逻辑是否正确. .net提供了很多方法来读写io数据,但不同通讯协议需要使用不同的方法调用. 另外,你的程序不应该"不断的接收数据和发送数据",这个是不对的,一定是逻辑有问题,或者是你想偷懒而做出的妥协,这种妥协通常在后来都会推翻重来的. 画个流程图吧,然后解释给别人听,如果你自己觉得逻辑严谨,有理有据,然后再写代码,也不迟.
回复
蜗牛慢慢趴 2020-12-25
你那个while True少了个大括号
回复
第27个Bug 2020-12-25
首先,你的程序运行的时候是这样子的

while (true)
    test.SendTest(b);//一直执行发送  
Thread.Sleep(100);//无法访问的代码  (这行代码永远无法执行)
一直执行的发送会写入大量发送的数据,IO处理没程序的快,就挂了呗。
回复
weixin_40125664 2020-12-25
引用 2 楼 ziqi0716的回复:
你拿消防栓开到最大,往你车油箱里面灌水,还问怎么回事?
我就是不太懂才发貼子问问,你何必怼我呢?而且我的程序真实情况就是不断的接收数据,然后发数据。现在只是全用异步,我就想看看是个什么效果,结果出现这个情况,就懵逼了。
回复
weixin_40125664 2020-12-25
引用 2 楼 ziqi0716的回复:
你拿消防栓开到最大,往你车油箱里面灌水,还问怎么回事?
那您觉得我因该怎么测试合理?
回复
weixin_40125664 2020-12-25
引用 1 楼 信仰诠释过往的回复:
关键在于 whlie(true) 一直在发送的死循环
我是用tcp助手当服务器收数据的啊,之前用同步的收发也挺正常的啊
回复
wanghui0380 2020-12-25
关键代码,发出来 _session.ClientSocket 我想知道这个的实现
回复
你这死循环写得,神威太湖之光都直摇头
回复
蜗牛慢慢趴 2020-12-25
引用 13 楼 weixin_40125664 的回复:
[quote=引用 7 楼 第27个Bug的回复:]首先,你的程序运行的时候是这样子的

while (true)
    test.SendTest(b);//一直执行发送  
Thread.Sleep(100);//无法访问的代码  (这行代码永远无法执行)
一直执行的发送会写入大量发送的数据,IO处理没程序的快,就挂了呗。
我不知道tcp调试助手是不是把收到的数据一直留着还是显示完了就完了。我现在改了一下程序,用代码写服务端,把数据放在listbox里显示,没有清出,一会也挂了,我又改了一下,到1000就清除listbox, 客户端用定时器发数据100毫秒一次就不挂了。只能猜是tcp助手没有清数据[/quote] 仔细看别人回复,看懂重点在哪,你一个死循环不sleep一直发,谁受得了?
回复
ziqi0716 2020-12-25
首先你要选用个通讯协议,一般不太可能自己定协议的(重复造轮子),比如文件传输,那就用ftp,网络接口,就用http,上位机相关可以用modbus,还有mqtt协议等. 就相当于从a地到b地,有很多方法,可以走路,可以骑车,可以高铁,可以飞机,但不是随便定的,对吧,比如去上班,你选个坐飞机一般情况下是不合适的吧.
回复
ziqi0716 2020-12-24
你拿消防栓开到最大,往你车油箱里面灌水,还问怎么回事?
回复
关键在于 whlie(true) 一直在发送的死循环
回复
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2020-12-24 03:34
社区公告

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