Socket中接受tcp数据包,怎么让他receive的时候,就接一个数据包?

DiligencyMan 2007-07-16 08:22:02
各位兄弟姐妹:
我在用socket进行tcp接数据包的时候,已经得到了数据包,但是每次都是数据包一起接受,由于数据包都是不一样的,而且内容长度又没有什么规律性,所以我无法把每一个包给区分出来,但是因为这是视频数据包,它每个数据包的包头都必须去掉,剩下的才是视频数据。

我想到一个解决办法,因为数据包之间没有任何规律性,所以能不能让tcp像udp那样,每一次receive的时候,就只接受一个数据包。这样我就好处理啦!但就是不知道怎么样才能让tcp receive的时候只接受一个数据包呢?

另外各位有什么更好的想法,指点下我啊,谢谢啦!

附上:我这里的tcp接受数据包的代码如下:
socket= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(new IPEndPoint(IPAddress.Parse(codeIP), tcpPort));

byte[] msg = new byte[10240];
//this.socket.Receive(msg);
socket.Receive(msg);


...全文
1177 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
RitaLG 2010-07-23
  • 打赏
  • 举报
回复
学习中
DiligencyMan 2007-07-23
  • 打赏
  • 举报
回复
问题还是没有解决,不过时间久啦,还是结贴吧!
下回开新帖再问大家啦!
liuchuan98 2007-07-18
  • 打赏
  • 举报
回复
学习中..
我以前发的信息打包成一个对象,长度是可变的,发送时装换成byte数组,接收时当接收到的也是一个对象,将byte数组直接转换对象即可.
没有考虑到会丢包或多包的问题,但一般来说都是对的.
xingtaisen 2007-07-18
  • 打赏
  • 举报
回复
我想是在发送的时候来定义数据包的:
int head = 0
int body = 1
int end = 2

你在打包的时候(包应该是字符串或者结构体吧?)把head,body,end标志都加上(定在第一个位上),在读包的时候,判断第一个位,可以知道是什么信息,一个head包和一个end包之间就是你所谓的"数据包";了.


**********************************************
email&msn:xingtaisen@126.com
QQ:654 1798 16
**********************************************
soaringbird 2007-07-18
  • 打赏
  • 举报
回复
你要分清楚几种包:你自己定义的包、TCP包、IP包,你自己定义的包太大,TCP/IP会给你拆包,也许你用EtherPeek.NX看到的包是TCP/IP包呢。如果TCP/IP包里面有分拆原始包的记录(我不知道有没有),也许能复原呢,但这也需要你直接处理底层的TCP/IP包。
其实对于不清楚TCP/IP底层的人来说,还是定义统一的包格式比较好。
DiligencyMan 2007-07-18
  • 打赏
  • 举报
回复
都快崩溃啦!
DiligencyMan 2007-07-18
  • 打赏
  • 举报
回复
问题还是没有解决啊,大家再指点指点啊!
wuhuiITren 2007-07-18
  • 打赏
  • 举报
回复
学习中..
RedGoldFish 2007-07-17
  • 打赏
  • 举报
回复
EtherPeek.NX.2.0 在不了解你的数据包头的情况下只能得到数据流(Stream),我不知道它有什么办法能提取出每一个数据包.

这里是不是观察的误差呢?实际上EtherPeek.NX.2.0也只是显示每次得到的数据(恰好是每次收到的一个包),这样一来在大多数情况下它显示的数据是一个整包,这实际上和你自己的程序是一样的,都不能应付多包(或者部分包)同时收到情况.
RedGoldFish 2007-07-16
  • 打赏
  • 举报
回复
对不起,TCP Socket 接收数据包的时候是无法控制每次接收数据包的个数的. 发送方可以一个一个地发,到了接收方根本不能保证一个一个地收,大部分时间可能是只收到一个,但有时候可能收到多个甚至部分数据包.

对这种情况通常是靠接收方利用包头做解析,这个工作可以占到一个Socket程序的一大部分代码.

最常用的手法是把接受到的Byte[]加到一个缓存里,比如List<byte>,每次处理的时候根据包头的定义按照包的长度从List从第一个byte开始取出只一个完整的包来处理,剩下的数据属于第二或者第三个包的. 如果List<byte>的数据长度不够一个包的,就暂时不处理,等到后续的数据都收到了再按照一个完整的包处理.

我上次给你的那个例子里就有处理包的代码,你可以参考下.
zpingy 2007-07-16
  • 打赏
  • 举报
回复
视频数据包是你自定义的吗?自定义的用自定义的固定格式来区分,比如特殊的标识
DiligencyMan 2007-07-16
  • 打赏
  • 举报
回复
高手快指点指点啊!
wzc999_ 2007-07-16
  • 打赏
  • 举报
回复
mark&up
yiwindlele 2007-07-16
  • 打赏
  • 举报
回复
发送数据包的机制是什么样子的......

一般来说要控制数据包接手,得自己打包写包头部信息
lovingkiss 2007-07-16
  • 打赏
  • 举报
回复
new byte[10240],设置大接得多——各类协议基本上都是这样,包括串口传输,都是可以设置缓冲区大小的。

串口肯定是这样——TCP好久没用了,不过原理应该是一样的。如果说错,算我胡说,呵呵~~

==================================================================
博客空间:http://blog.csdn.net/lovingkiss
资源下载:http://download.csdn.net/user/lovingkiss
Email:loving-kiss@163.com
本人说明:<我的帖子我做主,结贴率保持100%>
优惠接单开发,信誉保证,Q64180940(请清楚注明业务还是技术咨询)
==================================================================
DiligencyMan 2007-07-16
  • 打赏
  • 举报
回复
完啦,因为包头不是统一的,这下怎么办呢?对啦,我在一个软件(EtherPeek.NX.2.0)上面监测到我电脑收到的视频包都是一个个包,为什么EtherPeek.NX.2.0软件能自动的将一个包一个包分析出来呢,它也不知道发送方的规范啊?

因为EtherPeek.NX.2.0这个没有源代码,所以我看不到它内部关于接受到tcp数据包的处理机制,哪位有源代码的,或者知道这个软件的内部关于处理tcp数据包的机制的,指点啊,谢啦,我都快崩溃啦1
wangchuanguo 2007-07-16
  • 打赏
  • 举报
回复
内部通信协议
RedGoldFish 2007-07-16
  • 打赏
  • 举报
回复
LS 二位说的有道理,包头必须有统一的格式和符号,否则很难处理. 如果是你自己的程序发的包,你可以自定义一个格式; 如果不是你自己的程序发的,你需要找对方协商一个格式,这是做Socket传输必须的基本要求.
bote_china 2007-07-16
  • 打赏
  • 举报
回复
包头可以采用<BOF>00010240这样的形式,<BOF>为数据包标记,也可以为其它自定义的标记,00010240为数据内容的长度.每次接收到数据后,根据包头中信息截取数据内容.
jiatong1981 2007-07-16
  • 打赏
  • 举报
回复
数据包是谁发给你的

我想你们需要协商一下

统一好报文标准再做开发工作
加载更多回复(2)

110,555

社区成员

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

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

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