当前位置: 代码迷 >> C# >> 关于UDP接收缓冲区的一点疑问~多谢
  详细解决方案

关于UDP接收缓冲区的一点疑问~多谢

热度:341   发布时间:2016-04-28 08:31:28.0
关于UDP接收缓冲区的一点疑问~~~~~谢谢

之前发过一个帖子,如下,有人说 发送啥数据 接收的还是啥数据,于是我就结贴了,今天试了一下,发现接收到的数据的长度是设置的缓冲的长度,并不是发送过来的信息的长度。。。。我知道里面肯定有完整的数据,但是难道非要在头上加一个4个字节表示数据长度的信息才行吗?还有别的方法吗? 数据不能是定长的,但知道不会超过一个大小,因为我是分包发送的视频数据。。。。。。谢谢啦~~~ 或是有人知道用UDP发送视频 有什么更好的解决方案么?

刚开始学习socket编程。。。在UDP这一块有个小疑问,比如我有一个客户端,用UDP来接收服务端发来的数据,看下面代码

 DatagramSocket C_Socket = new DatagramSocket();
byte[] PacketB = new byte[1024];
 DatagramPacket ReceivePacket = new  DatagramPacket(PacketaB,PacketB.length);
C_Socket.receive(ReceivePacket);
//下面的各种代码。。。。。。。。。。。(抱歉这好像是java~ 不过没关系~ 语言都是共通的,原理都是一样的~~)

如果我设置的接收包缓冲为1024,没有数据发过来的时候是一直处于阻塞状态的,如果服务端发过来的一条数据只有byte[512]这么大,不满1024,程序还是会解除阻塞状态往下执行? 还是要一直等到1024的缓冲满了之后才往下执行?(抱歉,实在不太懂啦)

如果只要接收到数据,不管多大都会往下执行,如果数据量不大的情况下,只要估算一下服务端发送数据最大会是多少,然后接收端的缓冲只要比他大就OK了?。。。。。

多谢各种指点~~~谢谢啦~~

------解决思路----------------------
你试试就知道了啊 
在我映像中 udp 如果你的缓存区域的大小 buffer 小于 收到的数据包的大小 直接报出异常
你的缓存是用来接受数据用的 没有一定要塞满了才 继续往下走 如果说 要塞满了才往下走 那么 Recv 函数 返回一个接受到的数据长度还有什么意义?因为 他的长度永远都是缓存的大小[int len = Recv(buffer,0,buffer.Length)]
还有 你说你收到的长度是你缓存的长度
弱弱的问一句 你是不是这样发送的 send(buffer,0,buffer.Length)? 直接把你的整个缓存的数据都发送过去了?。。而不是 只发送有效数据过去的?
------解决思路----------------------
对于UDP,每一个消息倒是不用发“4个字节表示数据长度”。
因为UDP不是流协议,每个消息就是一个发送接收单位。这就是说一旦你收到一个UDP,它就是完整的一个发送。


如果你的数据需要多次UDP消息才能发送完整,那么简单的说,你就不能用UDP
因为:
1、UDP不保证次序。发s1,s2,s3三个消息,客户的接收循序可以是s2,s3,s1。
2、UDP不保证传达。发s1,s2,s3三个消息,可能客户只接收到两个消息s1,s3。

只有当你能容忍以上两个特点,你才用UDP。
  相关解决方案