Socket通信,"数据报套接字上发送的消息大于内部消息缓冲器"

时间:2022-09-14 17:54:35
服务器端:

    public class UDPServer
    {
        private IPEndPoint ipep;
        private Socket newsock;

        public UDPServer()
        {       
            ipep = new IPEndPoint(IPAddress.Any, 8112);
            newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            newsock.Bind(ipep);
        }

        public string Listen()
        {
            if (newsock.Available > 0)
            {
                int recv;
                byte[] data = new byte[1024 * 8]; //8K的缓存区大小
                  IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
                EndPoint Remote = (EndPoint)(sender);
                recv = newsock.ReceiveFrom(data, ref Remote);
                string datastr = Encoding.UTF8.GetString(data);
                return datastr;
            }
            else
                return null;
        }
    }


客户端:

    class UDPClient
    {
        private IPAddress GroupAddress;
        private int GroupPort = 8112;

        public UDPClient(string IP,int Port)
        {
            GroupAddress = IPAddress.Parse(IP);  
            GroupPort = Port;
        }

        public void Send(string source) 
        {  
            UdpClient sender = new UdpClient();  
            try 
            {
                IPEndPoint groupEP = new IPEndPoint(GroupAddress, GroupPort);
                byte[] data = Encoding.UTF8.GetBytes(source);
                sender.Send(data, data.Length, groupEP);  
                sender.Close();  
            }
            catch (System.Net.Sockets.SocketException ex) 
            {
                Debug.WriteLine(ex.Message);
                sender.Close();
            }
       }  
    }  


调用:

            UDPClient client = new UDPClient("192.168.58.124",8112);
            string html = ".......";
            client.Send(html);



异常:
一个在数据报套接字上发送的消息大于内部消息缓冲器或其他一些网络限制,或该用户用于接收数据报的缓冲器比数据报小。


只要传递的数据较大,就会报这个错.设置byte[] data = new byte[1024 * 1000]也不起作用,用UDP传递数据好象限制了固定大小.如何修改这个程序能够让传递较大数据?请贴出完整代码.
(请不要随便在网上找段代码照抄然后甩给人家看,谢谢!)

14 个解决方案

#1


一口是不能吃成胖子的,网络传输编程也是。一次想传完很大数据肯定不行,我记得ip\tcp的数据包最大支持好像1500个字节(记不清了,我的意思是说网络传输时数据的大小时受限制的)如果大于这个限制socket会分段的给你发回来。所以接受时需要循环接受。但是也有个问题就是你发送的两个数据之间区分问题。。这些问题都是很简单了,网上应该有很多代码,我比较懒就不写了。

#2


该回复于2010-01-19 17:23:37被版主删除

#3


udp有限制

常见IP碎片攻击详解
http://*.chinaunix.net/a5/b2/20021205/060200350.html
1. 为什么存在IP碎片 
-=-=-=-=-=-=-=-=-=-=-= 
链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一 
个上限值。以太网的MTU是1500,你可以用 netstat -i 命令查看这个值。如果IP层有数据包 
要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分片(fragmentation)操 
作,使每一片的长度都小于或等于MTU。我们假设要传输一个UDP数据包,以太网的MTU为150 

字节,一般IP首部为20字节,UDP首部为8字节,数据的净荷(payload)部分预留是 
1500-20-8=1472字节。如果数据部分大于1472字节,就会出现分片现象。 

#4


我现在的程序将来只会在局域网跑,所以攻击之类的暂时不考虑,只想先把功能实现先

#5


进来学习的

#6


你的代码没贴完啊
把整个项目发来看看啊

#7


引用 4 楼 dugupiaoyun 的回复:
我现在的程序将来只会在局域网跑,所以攻击之类的暂时不考虑,只想先把功能实现先


不是让你看怎么攻击,而是让你看他说udp数据最大长度的那部分,我已经贴出来了

#8


现在就是想知道使用UDP发送大数据如何去分包,接收端再如何接收得到完整的数据?

#9


(1)控制包的大小 IP层最大65535字节(ip包头长度16bit)决定UDP最大为65535-20-8(28为Ip包头与udp包头大小之和),链路层MTU(不同介质MTU大小不同,最小的296),当IP包大于MTU会造成IP层分片,容易导致丢片,所以为了避免分片常用包的大小为256,有的为512。
(2)把文件流按统一长度,分包发送。每个包至少两部分组成:顺序号+文件字节数据。
(3)接收时,安照顺序号,把收到的数据组装成一个文件。
(4)第一个包 包括:总文件长度,数据包数;最后一个包 加上结束标志
(5)还可以加校验位,数据包中的规则自己可以发挥,根据需要自己规定就行了。

#10


该回复于2009-12-28 11:34:28被版主删除

#11


该回复于2009-12-28 11:34:29被版主删除

#12


问下lz问题解决了吗,我也遇到这个问题了

#13


我想用udp给vlc发帧数据,无奈中

#14


Socket通信,"数据报套接字上发送的消息大于内部消息缓冲器"

#1


一口是不能吃成胖子的,网络传输编程也是。一次想传完很大数据肯定不行,我记得ip\tcp的数据包最大支持好像1500个字节(记不清了,我的意思是说网络传输时数据的大小时受限制的)如果大于这个限制socket会分段的给你发回来。所以接受时需要循环接受。但是也有个问题就是你发送的两个数据之间区分问题。。这些问题都是很简单了,网上应该有很多代码,我比较懒就不写了。

#2


该回复于2010-01-19 17:23:37被版主删除

#3


udp有限制

常见IP碎片攻击详解
http://*.chinaunix.net/a5/b2/20021205/060200350.html
1. 为什么存在IP碎片 
-=-=-=-=-=-=-=-=-=-=-= 
链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一 
个上限值。以太网的MTU是1500,你可以用 netstat -i 命令查看这个值。如果IP层有数据包 
要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分片(fragmentation)操 
作,使每一片的长度都小于或等于MTU。我们假设要传输一个UDP数据包,以太网的MTU为150 

字节,一般IP首部为20字节,UDP首部为8字节,数据的净荷(payload)部分预留是 
1500-20-8=1472字节。如果数据部分大于1472字节,就会出现分片现象。 

#4


我现在的程序将来只会在局域网跑,所以攻击之类的暂时不考虑,只想先把功能实现先

#5


进来学习的

#6


你的代码没贴完啊
把整个项目发来看看啊

#7


引用 4 楼 dugupiaoyun 的回复:
我现在的程序将来只会在局域网跑,所以攻击之类的暂时不考虑,只想先把功能实现先


不是让你看怎么攻击,而是让你看他说udp数据最大长度的那部分,我已经贴出来了

#8


现在就是想知道使用UDP发送大数据如何去分包,接收端再如何接收得到完整的数据?

#9


(1)控制包的大小 IP层最大65535字节(ip包头长度16bit)决定UDP最大为65535-20-8(28为Ip包头与udp包头大小之和),链路层MTU(不同介质MTU大小不同,最小的296),当IP包大于MTU会造成IP层分片,容易导致丢片,所以为了避免分片常用包的大小为256,有的为512。
(2)把文件流按统一长度,分包发送。每个包至少两部分组成:顺序号+文件字节数据。
(3)接收时,安照顺序号,把收到的数据组装成一个文件。
(4)第一个包 包括:总文件长度,数据包数;最后一个包 加上结束标志
(5)还可以加校验位,数据包中的规则自己可以发挥,根据需要自己规定就行了。

#10


该回复于2009-12-28 11:34:28被版主删除

#11


该回复于2009-12-28 11:34:29被版主删除

#12


问下lz问题解决了吗,我也遇到这个问题了

#13


我想用udp给vlc发帧数据,无奈中

#14


Socket通信,"数据报套接字上发送的消息大于内部消息缓冲器"