40 网络相关函数(八)——live555源码阅读(四)网络

时间:2022-10-20 09:35:40

40 网络相关函数(八)——live555源码阅读(四)网络

本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso
本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso

简介

网络相关函数是一系列用于操作网络数据的函数。在多个文件中都有相关的函数的定义。还有一些函数是系统socket API相关函数,就不提了。
   这一系列的函数大多有一个特点,需要一个UsageEnvironmet&型的参数。
   这些方法大多在live555sourcecontrol\groupsock\include\GroupsockHelper.hh中声明。

15)writeSocket向套接口写数据

writeSocket函数用于将buffer中的数据经socket套接口写入到目标主机(address + port)。参数ttlArg0时被忽略,不为0时设置此处发送数据包的最大路由跳转次数。

// 往套接口写数据
Boolean writeSocket(UsageEnvironment& env,
int socket, struct in_addr address, Port port,
u_int8_t ttlArg,
unsigned char* buffer, unsigned bufferSize)
{
do {
if (ttlArg != 0) {
// TTL是 Time To Live的缩写,该字段指定IP包被路由器丢弃之前允许通过的最大网段数量。
// TTL的最大值是255,TTL的一个推荐值是64。
// Before sending, set the socket's TTL:发送前设置socket TTL
#if defined(__WIN32__) || defined(_WIN32)
#define TTL_TYPE int
#else
#define TTL_TYPE u_int8_t
#endif
TTL_TYPE ttl = (TTL_TYPE)ttlArg;
// 设置多播TTL值
if (setsockopt(socket, IPPROTO_IP, IP_MULTICAST_TTL,
(const char*)&ttl, sizeof ttl) < 0) {
socketErr(env, "setsockopt(IP_MULTICAST_TTL) error: ");
break;
}
} MAKE_SOCKADDR_IN(dest, address.s_addr, port.num());
// 将buffer中的数据经socket发送到dest
int bytesSent = sendto(socket, (char*)buffer, bufferSize, 0,
(struct sockaddr*)&dest, sizeof dest);
// 发送非全部发送成功
if (bytesSent != (int)bufferSize) {
char tmpBuf[100];
sprintf(tmpBuf, "writeSocket(%d), sendTo() error: wrote %d bytes instead of %u: ", socket, bytesSent, bufferSize);
socketErr(env, tmpBuf);
break;
} return True; //发送成功返回
} while (0); return False; //失败返回
}

TTL的概念

TTLTime To Live的缩写,该字段指定IP包被路由器丢弃之前允许通过的最大网段数量。在IPv4包头中TTL是一个8 bit字段,它位于IPv4包的第9个字节。

40 网络相关函数(八)——live555源码阅读(四)网络

如上图所示,每一行表示32 bit(4字节),位从0开始编号,即0~31。
TTL的作用是限制IP数据包在计算机网络中的存在的时间。TTL的最大值是255,TTL的一个推荐值是64

虽然TTL从字面上翻译,是可以存活的时间,但实际上TTL是IP数据包在计算机网络中可以转发的最大跳数。TTL字段由IP数据包的发送者设置,在IP数据包从源到目的的整个转发路径上,每经过一个路由器,路由器都会修改这个TTL字段值,具体的做法是把该TTL的值减1,然后再将IP包转发出去。如果在IP包到达目的IP之前,TTL减少为0,路由器将会丢弃收到的TTL=0的IP包并向IP包的发送者发送ICMP time exceeded消息。
TTL的主要作用是避免IP包在网络中的无限循环和收发,节省了网络资源,并能使IP包发送者能收到告警消息。
TTL 是由发送主机设置的,以防止数据包不断在IP互联网络上永不终止地循环。转发IP数据包时,要求路由器至少将 TTL 减小 1。

函数sendto

函数原型

int sendto ( socket s , const void * msg, int len, unsigned int flags, const
struct sockaddr * to , int tolen ) ;

函数说明

sendto() 用来将数据由指定的socket传给对方主机。

参数说明:

  • s 为已建立连接的socket,如果利用UDP协议则不需经过连线操作。
  • msg 指向欲发送的数据内容
  • flags 一般设0,详细描述请参考send()
  • to 用来指定目的套接字的地址,结构ockaddr请参考bind()
  • tolen 为sockaddr的结构长度。

返回值

成功则返回实际传送出去的字节数,失败返回-1,错误原因存于errno中。

错误代码

  • EBADF 参数s非法的socket处理代码。
  • EFAULT 参数中有一指针指向无法存取的内存空间。
  • ENOTSOCK 参数 s为一文件描述词,非socket。
  • EINTR 被信号所中断。
  • EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断的。
  • ENOBUFS 系统的缓冲内存不足。
  • EINVAL 传给系统调用的参数不正确。

40 网络相关函数(八)——live555源码阅读(四)网络的更多相关文章

  1. 39 网络相关函数&lpar;七&rpar;——live555源码阅读&lpar;四&rpar;网络

    39 网络相关函数(七)——live555源码阅读(四)网络 39 网络相关函数(七)——live555源码阅读(四)网络 简介 14)readSocket从套接口读取数据 recv/recvfrom ...

  2. 38 网络相关函数&lpar;六&rpar;——live555源码阅读&lpar;四&rpar;网络

    38 网络相关函数(六)——live555源码阅读(四)网络 38 网络相关函数(六)——live555源码阅读(四)网络 简介 12)makeSocketNonBlocking和makeSocket ...

  3. 37 网络相关函数&lpar;五&rpar;——live555源码阅读&lpar;四&rpar;网络

    37 网络相关函数(五)——live555源码阅读(四)网络 37 网络相关函数(五)——live555源码阅读(四)网络 简介 10)MAKE_SOCKADDR_IN构建sockaddr_in结构体 ...

  4. 35 网络相关函数&lpar;三&rpar;——live555源码阅读&lpar;四&rpar;网络

    35 网络相关函数(三)——live555源码阅读(四)网络 35 网络相关函数(三)——live555源码阅读(四)网络 简介 5)NoReuse不重用地址类 6)initializeWinsock ...

  5. 34 网络相关函数&lpar;二&rpar;——live555源码阅读&lpar;四&rpar;网络

    34 网络相关函数(二)——live555源码阅读(四)网络 34 网络相关函数(二)——live555源码阅读(四)网络 2)socketErr 套接口错误 3)groupsockPriv函数 4) ...

  6. 33 网络相关函数&lpar;一&rpar;——live555源码阅读&lpar;四&rpar;网络

    33 网络相关函数(一)——live555源码阅读(四)网络 33 网络相关函数(一)——live555源码阅读(四)网络 简介 1)IsMulticastAddress多播(组播)地址判断函数 多播 ...

  7. 36 网络相关函数&lpar;四&rpar;——live555源码阅读&lpar;四&rpar;网络

    36 网络相关函数(四)——live555源码阅读(四)网络 36 网络相关函数(四)——live555源码阅读(四)网络 简介 7)createSocket创建socket方法 8)closeSoc ...

  8. 32 GroupSock&lpar;AddressPortLookupTable&rpar;——live555源码阅读&lpar;四&rpar;网络

    32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络 32 GroupSock(AddressPortLookupTable)——live555 ...

  9. 31 GroupSock&lpar;AddressString&rpar;——live555源码阅读&lpar;四&rpar;网络

    31 GroupSock(AddressString)——live555源码阅读(四)网络 31 GroupSock(AddressString)——live555源码阅读(四)网络 简介 Addre ...

随机推荐

  1. C语言错误之--初始值&lpar;低级错误&rpar;

    今天犯了一个低级错误,虽然低级,但是也不能忽视,一个低级错误以后可能小则浪费时间和精力,大则酿成整个app的项目bug.    

  2. JAVA利用ODBC读取DBF,可以解决javadbf&period;jar对DBF部分中文乱码和错行等杂症

    因为需要用ODBC所以需要是windows平台 1.安装VFP for ODBC驱动(系统自带的dBase驱动不行哈) 下载:VFPODBC.msi 安装好后ODBC dsn会多出来一个东东,如下图1 ...

  3. iOS-开发日志-UITextView介绍

    UITextView 属性 1.     text: 设置textView中文本 _textView.text = @"Now is the time for all good develo ...

  4. 你真的理解Java的this和super吗&quest;

    你不知道的this 很多介绍java的书籍都说this指该对象本身.我们来看下面代码: class Base{ private int i = 3; public Base() { this.disp ...

  5. EMV&sol;PBOC解析&lpar;三&rpar; TLV格式解析&lpar;C&num;&rpar;

    1.什么是TLV格式? TLV即Tag-Length-Value,常在IC卡与POS终端设备中通过这样的一个应用通信协议进行数据交换. 金融系统中的TLV是BER-TLV编码的一个特例编码规范,而BE ...

  6. What's New in C&num; 6&period;0&lpar;转&rpar;

    原文地址:http://www.codeproject.com/Tips/1023426/Whats-New-in-Csharp 本来想翻译一下贴出来,但是好像很多语言组织起来比较困难,读书少不会表达 ...

  7. 【转】Android Web Server

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://vaero.blog.51cto.com/4350852/1188602 Andr ...

  8. 查找算法(I) 顺序查找 二分查找 索引查找

    查找 本文为查找算法的第一部分内容,包括了基本概念,顺序查找.二分查找和索引查找.关于散列表和B树查找的内容,待有空更新吧. 基本概念 查找(search)又称检索,在计算机上对数据表进行查找,就是根 ...

  9. 高性能mysql 第六章查询性能优化 总结(上)查询的执行过程

    6  查询性能优化 6.1为什么查询会变慢 这里说明了的查询执行周期,从客户端到服务器端,服务器端解析,优化器生成执行计划,执行(可以细分,大体过程可以通过show profile查看),从服务器端返 ...

  10. web service 框架

    WebService简介 Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间, ...