sendto 的最大可发送数据长度受限于两个值。

第一 【2^16 -1 - 8 -20】

第二 【SO_SNDBUF】

解释受限于【2^16-1-8-20】

数据封装过程

第一步: 用户层 : user数据

第二步: udp层数据: udp首部(8) + user数据

第三步:

ip层数据报文: ip首部(20) + udp首部(8) + user 数据

因为,ip首部中用于表示ip数据报文段的长度为16bit,所有ip最大可封装的数据长度为【2^16-1-20】

所以user数据的最大长度为【2^16-1-20-8】.

注意引起ip分片是因为ip数据报文段>MTU(受限于链路层最大传输长度)。

而不是上层数据[udp首部+user数据]>[2^16-1-20],如果上层数据大于[2^16-1-20],将向上层返回错误。

ip层的处理情况可以这样理解:

1 将上层数据封装成一个ip数据报文,如果数据报文的数据部分大于【2^16-1-20】,返回错误

2 如果ip数据报文段大于MTU,则将该ip数据报文段进行分片处理,分成多个ip数据报文段

所以, 当sendto数据超过【2^16-1-20-8】时,系统会返回 Message too long 错误。

受限于【SO_SNDBUF】情况

可参看http://blog.chinaunix.net/uid-20662820-id-3600294.html

SO_SNDBUF 可由getsockopt 查看,可由setsockopt 设置

SO_SNDBUF 的取值规则可参看 http://blog.csdn.net/ziliangxiao/article/category/2210813

SO_SNDBUF 规定了ip层用于发送udp数据最大可分配空间的长度为Max_mem_alloc,一般Max_mem_alloc>=SO_SNDBUF

规则参看http://blog.chinaunix.net/uid-20662820-id-3600294.html

简而言之,ip层分配用于发送的报文段时,会查看已分配size_alloc的大小是否大于SO_SNDBUF

如果size_alloc大于等于SO_SNDBUF,则分配失败,即该udp数据报文发送失败No buffer space available

如果size_alloc小于SO_SNDBUF, 则分配成功成功

所以,有可能最后一次分配完时,已分配的size_alloc 会大于SO_SNDBUF

关键在于理解,每次分配是否成功取决于是否还有剩下的,而不在与剩下的够不够分配,

————————————————
版权声明:本文为CSDN博主「一人在人间」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ziliangxiao/article/details/24294991

unix udp sendto 最大可发送的数据长度的更多相关文章

  1. udp回显客户端发送的数据

    这里让客户端给服务端发送的数据被服务端自动发回来 客户端: import socket client_socket = socket.socket(socket.AF_INET, socket.SOC ...

  2. python join()方法的使用,可以应用到tcp压测发送指定数据长度的应用

    Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串.其中,序列中的元素应是字符串类型. 学习join()方法主要是为了配合随机数的使用,生产某个指定位数的随机数,在t ...

  3. A7139 无线通信驱动(STM32) 添加FIFO扩展模式,能够发送超大数据包

    A7139 拥有电磁波唤醒以及10mW的发射功率,很easy实现长距离通信,眼下測试有障碍物能够轻松达到300m以上. 通过几天的调试,眼下能够发送随意大小的数据包,大小为1-16KB.所有使用中断收 ...

  4. STM32 UART DMA实现未知数据长度接收

    串口通信是经常使用到的功能,在STM32中UART具有DMA功能,并且收发都可以使用DMA,使用DMA发送基本上大家不会遇到什么问题,因为发送的时候会告知DMA发送的数据长度,DMA按照发送的长度直接 ...

  5. 网络编程--使用UDP发送接收数据

    package com.zhangxueliang.udp; import java.io.IOException; import java.net.DatagramPacket; import ja ...

  6. UDP发送的数据 以数据包形式发送

    UDP发送的数据 以数据包形式发送

  7. UDP信息接收与发送

    转载:http://www.cnblogs.com/sunev/archive/2012/08/08/2627247.html 一.摘要 总结基于C#的UDP协议的同步通信. 二.实验平台 Visua ...

  8. linux系统中使用socket直接发送ARP数据

    这个重点是如这样创建socket:  sock_send = socket ( PF_PACKET , SOCK_PACKET , htons ( ETH_P_ARP) ) ; 其后所有收发的数据都是 ...

  9. C#UDP(接收和发送源码)源码完整

    C#UDP(接收和发送源码)源码完整 最近做了一个UDP的服务接收和发送的东西.希望能对初学的朋友一点帮助. 源码如下: 一.逻辑--UdpServer.cs using System;using S ...

随机推荐

  1. 英语aeroides海蓝宝石aeroides单词

    海蓝宝石(aeroides,Aquamarine)是一种含铍.铝的硅酸盐,与祖母绿.乌兰孖努以及碧玺等统称为彩色宝石.海蓝宝石的颜色为天蓝色至海蓝色或带绿的蓝色,它的颜色形成主要是由于含微量的二价铁离 ...

  2. Android-----创建SQLite数据库

    简单介绍一下Android系统内置轻便又功能强大的嵌入式数据库--SQLite. SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎,它是一款轻型的数据库,是遵守ACID的关 ...

  3. nginx 405错误

    nginx配置文件加上location / { try_files $uri $uri/ /index.php?$query_string; }

  4. pip换源-换成国内的源

    PyPI使用国内源   通过几次 pip 的使用,对于默认的 pip 源的速度实在无法忍受,于是便搜集了一些国内的pip源,如下: 阿里云 http://mirrors.aliyun.com/pypi ...

  5. win10和linux引导问题(没有系统选择界面)

    由于最近学习嵌入式和c模块化编程,需要使用Linux系统,但是编程之外,WIN10还是主力系统,决定装双系统. 往常一样,百度装双系统方法,网上千篇一律,大都一个套路. 首先,WIN10 下,新开一个 ...

  6. PAT 乙级 1006.换个格式输出整数 C++/Java

    1006 换个格式输出整数 (15 分) 题目来源 让我们用字母 B 来表示“百”.字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(n < 1000),换个格式来输出任一个不 ...

  7. 洛谷P3069 [USACO13JAN]牛的阵容Cow Lineup(尺取法)

    思路 考虑比较朴素的解法,枚举每个长度为\(k+1\)的区间,然后统计区间中出现次数最多的颜色.这样的话复杂度为\(O(n*k)\)的,显然不行. 观察到统计每个区间中出现次数最多的颜色中,可以只用看 ...

  8. 项目Beta冲刺(5/7)(追光的人)(2019.5.27)

    所属课程 软件工程1916 作业要求 Beta冲刺博客汇总 团队名称 追光的人 作业目标 描述Beta冲刺每日的scrum和PM报告两部分 队员学号 队员博客 221600219 小墨 https:/ ...

  9. python应用-21根火柴游戏

    """ 21跟火柴 """ from random import randint def main(): total=21 while to ...

  10. 牛客NOIP暑期七天营-提高组6C:分班问题 (组合数)

    题意:A班有N个人,B班有M个人,现在要组成一个新的班级C班,为了公平,从AB班各抽相同人数的人. 现在求所有方案中,人数之和是多少. 思路:即求Σ k*C(N,k)*C(M,k);    先忽略这个 ...