C# Socket通信丢包的问题

Nickiven007 2015-02-26 04:32:21
本人用C# Socket套接字技术 写了一个上位机程序 接收下位机上传的数据。下位机每8.4ms发送一帧数据 电脑接收以后 先存在一个缓存数组Buffer1内 当接收满1000帧后 将Buffer1丢到线程池 用FileStream进行写操作 存入硬盘。此时套接字继续接收数据 为了避免并发冲突 此时缓存数组更换为Buffer2。Buffer2接收满后 在丢到线程池 Buffer1 重新顶上进行缓存,如此交替进行。此程序在我的电脑上 运行没有问题。我的电脑为win7的系统 I3的处理器。但是当我将程序在另一台电脑上运行时 发现各种丢包。我将程序中不必要的线程池(包括数据解析)操作全都注释起来,仅保留Socket接收,丢包数下降 但是平均每天仍然有一帧(8.4ms)的数据丢失。另一台电脑为XP系统 Core2 Duo的处理器。比较老的破机子了。
是因为电脑配置的问题导致丢包么 如何解决这个问题啊?本人新手 虚心受教了 请大家帮帮我。
另:Socket套接字在一个Background线程中 由一个ChoiceBox控制启停
...全文
1230 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
生财 2015-03-06
  • 打赏
  • 举报
回复

楼主可以这样写
byte[] recbuff=new byte[1024*1024]
List<byte[]> list=new List<byte[]>();
while(clientSocket.Connectioned)
{
 int len= clientSocket.Receive(recbuff);
   //这里可以用array copy 方法复制
   //为了简单用Linq了
  var data=recbuff.Take(len);
lock(list)
{
//添加到集合中
list.Add(data);
}
}

///////////////////////外面取list值
lock(list)
{
    data = list[0];
    list.Remove(0)
}

//楼主用以上方法试试
kingdom_0 2015-03-02
  • 打赏
  • 举报
回复
抛开粘包不说,设计思路也有问题。 典型的生产者消费者问题,一个buffer作为缓冲区足够了
足球中国 2015-03-01
  • 打赏
  • 举报
回复
引用 9 楼 xian_wwq 的回复:
[quote=引用 6 楼 Nickiven007 的回复:] [quote=引用 1 楼 lincolnandlinda 的回复:] 把Socket接收帧的那块代码贴出来看看
请指教 [/quote] 感觉接收逻辑有些问题 你接收到的长度不一定是1024,怎么能循环按照1024拷贝呢? 不管网络状况是否良好,“粘包”处理是少不了的 [/quote] 就是, 这个不是丢包,是根本没有对粘包做处理。最起码的
PaulyJiang 2015-02-28
  • 打赏
  • 举报
回复
丢包应该是网络问题,代码需要处理
Sunny5816 2015-02-28
  • 打赏
  • 举报
回复
朋友,您可以尝试一下英国的开源的NetworkComms2.31 通信框架 (c#语言)
Sunny5816 2015-02-28
  • 打赏
  • 举报
回复
来学习
xian_wwq 2015-02-27
  • 打赏
  • 举报
回复
1.估算下最大的数据量,如果百兆网卡带宽占用不到10M以上, 可以肯定的说不是网络导致的丢包, 2.查一下数据接收逻辑,是不是在接收时,进行了其他逻辑校验之类的工作。 把耗时的逻辑处理统统放到线程池中去, 接收逻辑要尽可能的简化,收到数据,放入buffer,本次操作就返回。
  • 打赏
  • 举报
回复
那个例子的帖子地址是这个:http://bbs.csdn.net/topics/390987992 不要总是把时间全都花在底层代码上。最好达到那种程度,我们谈得主要都是是围绕“一个服务器控制几百台不同任务的客户端、十几台服务器协同组成集群”之时的信令设计和业务流程设计话题,而不是这些底层的代码。
  • 打赏
  • 举报
回复
你可以参考我贴出的一个“Base”的例子,参考其中的 container、len 和 buffer 的处理。 通讯部分应该做成一两个“基础程序”,以后各种应用只要重复使用它就好了(只要初始化对象参数、捕获其事件、调用其SendMessage方法就好了)。不要在各种应用中都去重写底层代码。
本拉灯 2015-02-27
  • 打赏
  • 举报
回复
..这么写不丢才怪。。
xian_wwq 2015-02-27
  • 打赏
  • 举报
回复
引用 6 楼 Nickiven007 的回复:
[quote=引用 1 楼 lincolnandlinda 的回复:] 把Socket接收帧的那块代码贴出来看看
请指教 [/quote] 感觉接收逻辑有些问题 你接收到的长度不一定是1024,怎么能循环按照1024拷贝呢? 不管网络状况是否良好,“粘包”处理是少不了的
Nickiven007 2015-02-27
  • 打赏
  • 举报
回复
引用 4 楼 xian_wwq 的回复:
1.估算下最大的数据量,如果百兆网卡带宽占用不到10M以上, 可以肯定的说不是网络导致的丢包, 2.查一下数据接收逻辑,是不是在接收时,进行了其他逻辑校验之类的工作。 把耗时的逻辑处理统统放到线程池中去, 接收逻辑要尽可能的简化,收到数据,放入buffer,本次操作就返回。
数据量8.4MS 1K算大么 接收就放入buffer 没有任何逻辑处理 上面贴了代码 请您看一下
Nickiven007 2015-02-27
  • 打赏
  • 举报
回复
引用 2 楼 daonidedie 的回复:
楼主,的程序数据量多大? TCP应该不会丢包.
数据量不大啊 8.4MS 1K
Nickiven007 2015-02-27
  • 打赏
  • 举报
回复
引用 1 楼 lincolnandlinda 的回复:
把Socket接收帧的那块代码贴出来看看

请指教
s8848 2015-02-27
  • 打赏
  • 举报
回复
网卡存在的问题,网卡有时候自己会自做主张的把包了.尤其是当cpu卡的时候.
长空X 2015-02-26
  • 打赏
  • 举报
回复
会不会是电脑配置或网络环境的问题呢?还有就是收包时的逻辑、。这几个地方有可能就是影响的
生财 2015-02-26
  • 打赏
  • 举报
回复
楼主,的程序数据量多大? TCP应该不会丢包.
lincolnandlinda 2015-02-26
  • 打赏
  • 举报
回复
把Socket接收帧的那块代码贴出来看看

111,097

社区成员

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

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

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