社区
C#
帖子详情
c# socket/tcp发送消息太快时就会丢数据,请各位给个思路
joe51586
2010-12-31 02:10:12
我客户端使用TcpClient,服务端使用异步Socket接收数据。
客户端如果每发一条sleep(1)的话,客户端发多少,服务端就收多少,但如果我每次发3条以上再 sleep(1)一次的话,服务端总会少几条数据,,不知道这是为什么,全过程也没有任何地方报错。
请各位懂的人给个调试思路啊。。。
另备注:客户端和服务端的发送与接收缓冲区均设置的1024*32,每次发送的数据包也很小。
...全文
1385
8
打赏
收藏
c# socket/tcp发送消息太快时就会丢数据,请各位给个思路
我客户端使用TcpClient,服务端使用异步Socket接收数据。 客户端如果每发一条sleep(1)的话,客户端发多少,服务端就收多少,但如果我每次发3条以上再 sleep(1)一次的话,服务端总会少几条数据,,不知道这是为什么,全过程也没有任何地方报错。 请各位懂的人给个调试思路啊。。。 另备注:客户端和服务端的发送与接收缓冲区均设置的1024*32,每次发送的数据包也很小。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
人到中年琐事多
2010-12-31
打赏
举报
回复
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
嗯,我看得不认真,呵呵。
您有什么办法让消息队列在进与出的时候,速度更快些吗?
Modbus-
Tcp
采用
Socket
与NModbus两种方式
此案例采用modbus-
tcp
协议与设备进行通信,且分别应用
Socket
与第三方组件NModbus两种方式进行通信。
c#
编写的基于
Socket
的异步通信系统封装DLL--SanNiuSignal.DLL
SanNiuSignal是一个基于异步
socket
的完全免费DLL;它里面封装了Client,Server以及UDP;有了这个DLL;用户不用去关心心跳;粘包 ;组包;
发送
文件等繁琐的事情;大家只要简单的几步就能实现强大的通信系统;能帮助到大家是本人觉得最幸福的事情,也希望大家 在用的过程中找出DLL中不足的地方;好改正;此DLL的苹果版和java版正在努力开发中......交流QQ:365368248;此演示源码下载地址:http://pan.baidu.com/s/1eQw1npw 里面包括了SanNiuSignal.DLL 下面为大家介绍一下 如何使用SanNiuSignal. 1 ) :
TCP
Server服务器,通过静态方法TxStart.startServer注册成功服务器ITxServer;然后通过ITxServer设置好各种属性;最后启动 ITxServer.StartEngine();就可以了;具体可以到demo里去看;相对来说比较简单,下面来说一下需要注意的地方 一:ITxServer.BufferSize,就是接收
数据
缓冲区大小;默认为1kb,不要小于50字节,而且要和客户端设置成一样;否则
会
出现不可预知 的错误;这个缓冲区的大小,不
会
影响你每次
发送
数据
的大小;大小只能提高你的
发送
速度 二:ITxServer.sendMessage
发送
前先判断此IPEndPoint客户端是否在线;因为如果不在线等情况发生;此方法没有任何
消息
产生;如 果
发送
成功并且对方已经收到;
会
触发
发送
成功的事件; 三:用户可以通过ITxServer.FileLog记录服务器的运行信息; 2 ) :
TCP
Client客户端,通过静态方法TxStart.startClient(服务器地址或网址, 服务器端口号)注册成功客户端ITxClient;然后通过 ITxClient设置好各种属性;最后启动ITxClient.StartEngine();跟服务器启动差不多;具体可以到demo里去看;客户端要注意的一些地 方 一:如果非服务器强制关闭客户端的情况下,掉线的话,客户端默认是要重连的;他的原理是这样的,每10秒重连一次;重连 ITxClient.ReconnectMax次如果失败;
会
自动关闭客户端引擎;在重连的过程中;你可以改变客户端连接服务器的IP地址和端口号;但 如果当断开的
时
候不想重连;可以设置ITxClient.ReconnectMax=0; 二:登录篇,在引擎启动之前,用户可以设置ITxClient.OutTime来设置超
时
时
间;默认为10秒,也就是说10秒之内肯定
会
有一个登录结果 ;登录成功或登录失败。有了登录结果
会
触发登录结果事件; 3 ) :Udp引擎,通过静态方法TxStart.startUdp()注册成功UDP--IUdpTx;然后通过IUdpTx设置好各种属性;最后启动 IUdpTx.StartEngine();如果在启动之前要绑定端口号,
请
在这里设置IUdpTx.Port;否则是随机使用本地端口;无论是UDP还是服务器和 客户端;它们的很多方法和属性以及事件都是相同的,因为他们都继承了通信系统的基接口ITxBase;下面是UDP引擎要注意的地方 一:UDP的优势在于速度快但不太可靠;所以有些属性不能设置的太过,如IUdpTx.BufferSize;默认为1KB,如果在广域网上
发送
信息, 缓冲区大小不要超过默认值;否则
数据
会
丢
失,如果一次性
数据
大于1KB;也没事,系统
会
自动分包
发送
;不太
会
丢
包。 4 ) :文件
发送
系统,通过静态方法FileStart.StartFileSend(IFileSendMust)生成一个文件
发送
系统IFileSend;其中IFileSendMust是 必须实现的一个接口;具体参照demo;然后通过IFileSend设置好各种属性;
发送
还是要通过前面的三个引擎系统
发送
的;如 ITxClient.SendFile 这
时
会
返回一个文件标签,是一个整数;IFileSend可以通过操作这个标签来操作这个正在
发送
的文件;接收文件 系统也一样;也是通过文件标签来操作;文件续传也是一样,也要通过前面的三个通信引擎系统进行续传;因为文件系统不能决定用户 通过哪个通信系统进行续传的;例如IUdpTx.ContinueFile进行续传;大家也可以试一下 掉线之后重新连接也可以续传; 5 ) :文件接收系统,通过静态方法FileStart.StartFileReceive(IFileReceiveMust)生成一个文件接收系统IFileReceive;其中 IFileReceiveMust是接收方必须实现的一个接口;具体参照demo;然后通过IFileReceive设置好各种属性;下面来讲讲文件系统要注意 的几个要点 一:每个文件都有一个文件标签,
发送
系统和接收系统是通过控制这个标签来控制这个文件的;如果是同一个文件传输,标签也一样的; 二:要注意属性BufferSize缓冲区大小,他是代表一次传送的字节数;如果这个文件缓冲区越大,传输速度越快;具体要设置成多少,大 家自己去调试;
TCP
传输的话一般可以设置成比较大,但UDP的话这个不要超过1KB;所以传输大文件尽量不要用UDP这种不可靠的东东; 三:当网络等各种原因中断文件的
时
候;
会
触发文件中断事件;文件自动处于暂停
发送
或接收状态;等待续传;续传的
发送
方,如果对方 同意续传;对方将不
会
触发续传开始的方法;别的大家可以通过demo里去发现; 总结: 其实这个DLL相对来讲是比较简单的;大家只要掌握这五个接口;1:ITxServer
TCP
服务器接口 2:ITxClient
TCP
客户端接口 3:IUdpTx UDP接口 4:IFileSend 文件
发送
方接口 5:IFileReceive 文件接收方接口 前面三个接口是通过TxStart启动;后面二个文件接口 是通过FileStart启动 今天先讲到这里;希望这个DLL对大家有所帮助;不足之处希望通过QQ或博客园大家一起交流;谢谢 此演示源码下载地址:http://pan.baidu.com/s/1eQw1npw 里面包括了SanNiuSignal.DLL
音视频传输
socket
编程解决方案
一套音视频传输开源方案,支持C++、
C#
、java多种语言
winsock-udp.rar_UDP 广播
c#
_UDP广播_Winsock UDP_
tcp
serverclient.zip_
网络信息或短信广播
国产框架HP-
Socket
全文件资源
Windows系统和Linux系统都有,有七八个版本,从2010的到2019的,有Domo,有好几种语言,c++,E,
c#
等。
C#
111,098
社区成员
642,554
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章