日期:2014-05-19  浏览次数:20730 次

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);
                     



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

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

==================================================================
博客空间:http://blog.csdn.net/lovingkiss
资源下载:http://download.csdn.net/user/lovingkiss
Email:loving-kiss@163.com
本人说明: <我的帖子我做主,结贴率保持100%>
优惠接单开发,信誉保证,Q64180940(请清楚注明业务还是技术咨询)
==================================================================
------解决方案--------------------
发送数据包的机制是什么样子的......

一般来说要控制数据包接手,得自己打包写包头部信息
------解决方案--------------------
mark&up
------解决方案--------------------
视频数据包是你自定义的吗?自定义的用自定义的固定格式来区分,比如特殊的标识
------解决方案--------------------
对不起,TCP Socket 接收数据包的时候是无法控制每次接收数据包的个数的. 发送方可以一个一个地发,到了接收方根本不能保证一个一个地收,大部分时间可能是只收到一个,但有时候可能收到多个甚至部分数据包.

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

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

我上次给你的那个例子里就有处理包的代码,你可以参考下.
------解决方案--------------------
包头可以采用 <BOF> 00010240这样的形式, <BOF> 为数据包标记,也可以为其它自定义的标记,00010240为数据内容的长度.每次接收到数据后,根据包头中信息截取数据内容.
------解决方案--------------------
你要分清楚几种包:你自己定义的包、TCP包、IP包,你自己定义的包太大,TCP/IP会给你拆包,也许你用EtherPeek.NX看到的包是TCP/IP包呢。如果TCP/IP包里面有分拆原始包的记录(我不知道有没有),也许能复原呢,但这也需要你直接处理底层的TCP/IP包。
其实对于不清楚TCP/IP底层的人来说,还是定义统一的包格式比较好。
------解决方案--------------------
我想是在发送的时候来定义数据包的:
int head = 0
int body = 1
int end = 2

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


**********************************************
email&msn:xingtaisen@126.com
QQ:654 1798 16
**********************************************