博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
40 网络相关函数(八)——live555源码阅读(四)网络
阅读量:6308 次
发布时间:2019-06-22

本文共 2724 字,大约阅读时间需要 9 分钟。

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

简介

网络相关函数是一系列用于操作网络数据的函数。在多个文件中都有相关的函数的定义。还有一些函数是系统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个字节。

如上图所示,每一行表示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, conststruct 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 传给系统调用的参数不正确。

转载地址:http://ltxxa.baihongyu.com/

你可能感兴趣的文章
Linux信号 编程
查看>>
有关滚动与位置
查看>>
Box2D自定义重力
查看>>
chpasswd
查看>>
mysqldump --single-transaction 和--lock-tables参数详解
查看>>
android 数据库_sql语句总结
查看>>
python购物车
查看>>
解决python2和python3的pip冲突
查看>>
面试/编程
查看>>
linux每日命令(16):head命令
查看>>
公司内部分享【富有成效的每日站会】总结
查看>>
打造一个上传图片到图床利器的插件(Mac版 开源)
查看>>
iOS横竖屏
查看>>
thinkphp判断更新是否成功
查看>>
Do While ... Loop 与 Do Until ... Loop 的区别
查看>>
【Linux】查询某个字符串出现次数
查看>>
高效使用jquery之一:请使用'On'函数
查看>>
冲刺第一周第三天
查看>>
ERP环境检测工具设计与实现 Environment Detection
查看>>
不要在构造中做太多事情,不然有时候会出现有意思的代码~
查看>>