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

各位兄弟姐妹: 
        我在用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); 
                     
------回答---------
------其他回答(25分)---------
new   byte[10240],设置大接得多——各类协议基本上都是这样,包括串口传输,都是可以设置缓冲区大小的。 
串口肯定是这样——TCP好久没用了,不过原理应该是一样的。如果说错,算我胡说,呵呵~~ 
================================================================== 
博客空间:http://blog.csdn.net/lovingkiss 
资源下载:http://download.csdn.net/user/lovingkiss 
Email:loving-kiss@163.com 
本人说明: <我的帖子我做主,结贴率保持100%> 
优惠接单开发,信誉保证,Q64180940(请清楚注明业务还是技术咨询)   
==================================================================
------其他回答(5分)---------
发送数据包的机制是什么样子的...... 
一般来说要控制数据包接手,得自己打包写包头部信息
------其他回答(5分)---------
mark&up
------其他回答(10分)---------
视频数据包是你自定义的吗?自定义的用自定义的固定格式来区分,比如特殊的标识
------其他回答(30分)---------
对不起,TCP   Socket   接收数据包的时候是无法控制每次接收数据包的个数的.   发送方可以一个一个地发,到了接收方根本不能保证一个一个地收,大部分时间可能是只收到一个,但有时候可能收到多个甚至部分数据包.   
对这种情况通常是靠接收方利用包头做解析,这个工作可以占到一个Socket程序的一大部分代码. 
最常用的手法是把接受到的Byte[]加到一个缓存里,比如List <byte> ,每次处理的时候根据包头的定义按照包的长度从List从第一个byte开始取出只一个完整的包来处理,剩下的数据属于第二或者第三个包的.   如果List <byte> 的数据长度不够一个包的,就暂时不处理,等到后续的数据都收到了再按照一个完整的包处理. 
我上次给你的那个例子里就有处理包的代码,你可以参考下.
------其他回答(5分)---------
包头可以采用 <BOF> 00010240这样的形式, <BOF> 为数据包标记,也可以为其它自定义的标记,00010240为数据内容的长度.每次接收到数据后,根据包头中信息截取数据内容.
------其他回答(5分)---------
你要分清楚几种包:你自己定义的包、TCP包、IP包,你自己定义的包太大,TCP/IP会给你拆包,也许你用EtherPeek.NX看到的包是TCP/IP包呢。如果TCP/IP包里面有分拆原始包的记录(我不知道有没有),也许能复原呢,但这也需要你直接处理底层的TCP/IP包。 
其实对于不清楚TCP/IP底层的人来说,还是定义统一的包格式比较好。
------其他回答(5分)---------
我想是在发送的时候来定义数据包的: 
int   head   =   0 
int   body   =   1 
int   end   =   2 
你在打包的时候(包应该是字符串或者结构体吧?)把head,body,end标志都加上(定在第一个位上),在读包的时候,判断第一个位,可以知道是什么信息,一个head包和一个end包之间就是你所谓的 "数据包 ";了. 
********************************************** 
email&msn:xingtaisen@126.com 
QQ:654   1798   16 
**********************************************
------其他回答(5分)---------
学习中.. 
我以前发的信息打包成一个对象,长度是可变的,发送时装换成byte数组,接收时当接收到的也是一个对象,将byte数组直接转换对象即可. 
没有考虑到会丢包或多包的问题,但一般来说都是对的.
------其他回答(5分)---------
学习中..
------回答---------

------其他回答(25分)---------

new   byte[10240],设置大接得多——各类协议基本上都是这样,包括串口传输,都是可以设置缓冲区大小的。 

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

================================================================== 
博客空间:http://blog.csdn.net/lovingkiss 
资源下载:http://download.csdn.net/user/lovingkiss 
Email:loving-kiss@163.com 
本人说明: <我的帖子我做主,结贴率保持100%> 
优惠接单开发,信誉保证,Q64180940(请清楚注明业务还是技术咨询)   
==================================================================
------其他回答(5分)---------

发送数据包的机制是什么样子的...... 

一般来说要控制数据包接手,得自己打包写包头部信息
------其他回答(5分)---------

mark&up
------其他回答(10分)---------

视频数据包是你自定义的吗?自定义的用自定义的固定格式来区分,比如特殊的标识
------其他回答(30分)---------

对不起,TCP   Socket   接收数据包的时候是无法控制每次接收数据包的个数的.   发送方可以一个一个地发,到了接收方根本不能保证一个一个地收,大部分时间可能是只收到一个,但有时候可能收到多个甚至部分数据包.   

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

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

我上次给你的那个例子里就有处理包的代码,你可以参考下.
------其他回答(5分)---------

包头可以采用 <BOF> 00010240这样的形式, <BOF> 为数据包标记,也可以为其它自定义的标记,00010240为数据内容的长度.每次接收到数据后,根据包头中信息截取数据内容.
------其他回答(5分)---------

你要分清楚几种包:你自己定义的包、TCP包、IP包,你自己定义的包太大,TCP/IP会给你拆包,也许你用EtherPeek.NX看到的包是TCP/IP包呢。如果TCP/IP包里面有分拆原始包的记录(我不知道有没有),也许能复原呢,但这也需要你直接处理底层的TCP/IP包。 
其实对于不清楚TCP/IP底层的人来说,还是定义统一的包格式比较好。
------其他回答(5分)---------

我想是在发送的时候来定义数据包的: 
int   head   =   0 
int   body   =   1 
int   end   =   2 

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


********************************************** 
email&msn:xingtaisen@126.com 
QQ:654   1798   16 
********************************************** 
------其他回答(5分)---------

学习中.. 
我以前发的信息打包成一个对象,长度是可变的,发送时装换成byte数组,接收时当接收到的也是一个对象,将byte数组直接转换对象即可. 
没有考虑到会丢包或多包的问题,但一般来说都是对的.
------其他回答(5分)---------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值