c# socket/tcp发送消息太快时就会丢数据,请各位给个思路

joe51586 2010-12-31 02:10:12
我客户端使用TcpClient,服务端使用异步Socket接收数据。
客户端如果每发一条sleep(1)的话,客户端发多少,服务端就收多少,但如果我每次发3条以上再 sleep(1)一次的话,服务端总会少几条数据,,不知道这是为什么,全过程也没有任何地方报错。

请各位懂的人给个调试思路啊。。。

另备注:客户端和服务端的发送与接收缓冲区均设置的1024*32,每次发送的数据包也很小。
...全文
1460 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
MS就是这个套话,我都会背下来了
凡是静态方法,都是线程安全的,凡是实例成员,都不能保证一定是线程安全的
kid_wang 2010-12-31
  • 打赏
  • 举报
回复
MSDN上课没说List<T>是线程安全的,下面是上面的原话


此类型的公共静态(在 Visual Basic 中为 Shared)成员是线程安全的。但不保证所有实例成员都是线程安全的。

只要不修改该集合,List<T> 就可以同时支持多个阅读器。枚举整个集合本质上不是一个线程安全的过程。在枚举与一个或多个写访问竞争的罕见情况下,确保线程安全的唯一方法是在整个枚举期间锁定集合。若允许多个线程对集合执行读写操作,您必须实现自己的同步。
joe51586 2010-12-31
  • 打赏
  • 举报
回复
楼上的朋友,我已经找出问题了。

现在的问题是,加了读写锁以后,如果让消息读出的速度更快些。
如果不加锁,又如何保障读写不会出错。

一切都是为了速度,为了更快些~~
evolve724 2010-12-31
  • 打赏
  • 举报
回复
确定是丢失吗
一般是所谓的TCP “粘包" 现象吧
joe51586 2010-12-31
  • 打赏
  • 举报
回复
经过几个小时的折腾,终于得出结论。
发现不将消息队列锁住它就会出现一个意向不到的事情,List<T>官方说是线程安全的,不过好像并不安全呀。
我是用List泛型做消息队列,因为官方说它是安全的,我就将消息锁注释了,有高频率的消息插出和取出的时候 list[0]的位置的消息不一定是事实上的第一个对象。MS真是整人啊!!!

换上消息锁之后,运行效率变低了,每秒只能处理2500条消息了,相当不爽哎。

CGabriel 2010-12-31
  • 打赏
  • 举报
回复
装个网络抓包软件,例如 wireshark,对比一下你的服务端接受到的内容。。

你就一定会发现,所谓的“丢失”数据,只是你的服务端自己把数据主动扔掉而已。
SoftwareHunter 2010-12-31
  • 打赏
  • 举报
回复
不太清楚你的需求。瞎说一下

试试读写锁

joe51586 2010-12-31
  • 打赏
  • 举报
回复
to kid_wang
嗯,我看得不认真,呵呵。
您有什么办法让消息队列在进与出的时候,速度更快些吗?

111,110

社区成员

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

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

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