100分变态问题:异步Socket快速发送时导致客户端缓冲区溢出,高手请进。

钟奎 2005-06-22 09:55:00
服务器端:开10个Thread向客户端Socket.BeginSend发送数据包,每包180个字节,在回调时,不在EndSend前Thread.Sleep(10),客户端一段时间后就会接收到错误的消息结构,接着就解析失败退出了。打印了客户端缓冲区buffer的消息,发现了一个规律:5个180字节的数据包,最后一个是124字节的数据包,计算长度:5 x 180 + 124 = 1024,这不是客户端定义的buffer大小吗?问题找到了,原来服务器发送太快,客户端来不及处理,缓冲区被填满了,导致错误。

现在的解决办法就是上述的Thread.Sleep(),这样做延迟回调完成的时间,基本上保证了客户端能及时处理数据,但不科学。

变态问题:服务器端能不能计算获得客户端缓冲区(已知大小1024),还有多少空闲,有就发送,不够就等待,请高手列出计算方法.....
...全文
576 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lampson123 2005-06-30
  • 打赏
  • 举报
回复
多线程跑的时候,最好将缓冲区锁起来,
尤其是在写多个文件的时候,最容易出问题
copine 2005-06-30
  • 打赏
  • 举报
回复
呵呵,这两天看到了一个类似的问题,客户端设个写入缓冲区和一个发送缓冲区,10个线程都向写入缓冲区写数据,另外起个线程定时从写入缓冲区移动数据到发送缓冲区,然后再从发送缓冲区发送数据,只要注意移动数据时对写入缓冲区加锁就好了。
jxw 2005-06-30
  • 打赏
  • 举报
回复
怎么能在服务器端知道客户端接收数据的缓冲区大小?亦茫然~~
若要控制服务器端发送数据大小倒是可以控制的。
我觉得更科学的是客户端应该“拼包”,缓冲区解析错误的应该拼接吧
gzlucky 2005-06-30
  • 打赏
  • 举报
回复
我不明白你所说的客户端缓冲是指什么?在TCP通讯中,默认的包大小是15xx字节,而且Windows的接收队列内的缓冲应该是8K。在TCP通讯时,发送方只不过把数据发送到接收方的缓冲中,如果满上后,发送方会主动退出,并返回成功发送的字节数,应用需要自己把剩余的数据继续发送一次。

你是否有检查你发送成功后的字节数是否与你所需要发送的字节数相等?
钟奎 2005-06-30
  • 打赏
  • 举报
回复
真的没人知道??
3天后揭帖..
钟奎 2005-06-23
  • 打赏
  • 举报
回复
客户端和服务器端是以标准的协议进行通讯的,比如cmpp协议,你这样岂不是要增加协议?再说客户端处理是不准修改的,此法不可取。


继续 ........
dazhu2 2005-06-22
  • 打赏
  • 举报
回复
你在发送文件前 先发一个要发送文件的信息,如:文件的长度,要几个线程处理,在对方获得这些信息后,再正式发送文件。
接受数据端根据先得到的文件信息后,就可以采取和发送端一致的处理方法。一切就ok了

111,119

社区成员

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

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

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