40 网络相关函数(八)——live555源码阅读(四)网络
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)。参数ttlArg为0时被忽略,不为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的概念
TTL是Time 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, 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源码阅读(四)网络的更多相关文章
- 39 网络相关函数(七)——live555源码阅读(四)网络
39 网络相关函数(七)——live555源码阅读(四)网络 39 网络相关函数(七)——live555源码阅读(四)网络 简介 14)readSocket从套接口读取数据 recv/recvfrom ...
- 38 网络相关函数(六)——live555源码阅读(四)网络
38 网络相关函数(六)——live555源码阅读(四)网络 38 网络相关函数(六)——live555源码阅读(四)网络 简介 12)makeSocketNonBlocking和makeSocket ...
- 37 网络相关函数(五)——live555源码阅读(四)网络
37 网络相关函数(五)——live555源码阅读(四)网络 37 网络相关函数(五)——live555源码阅读(四)网络 简介 10)MAKE_SOCKADDR_IN构建sockaddr_in结构体 ...
- 35 网络相关函数(三)——live555源码阅读(四)网络
35 网络相关函数(三)——live555源码阅读(四)网络 35 网络相关函数(三)——live555源码阅读(四)网络 简介 5)NoReuse不重用地址类 6)initializeWinsock ...
- 34 网络相关函数(二)——live555源码阅读(四)网络
34 网络相关函数(二)——live555源码阅读(四)网络 34 网络相关函数(二)——live555源码阅读(四)网络 2)socketErr 套接口错误 3)groupsockPriv函数 4) ...
- 33 网络相关函数(一)——live555源码阅读(四)网络
33 网络相关函数(一)——live555源码阅读(四)网络 33 网络相关函数(一)——live555源码阅读(四)网络 简介 1)IsMulticastAddress多播(组播)地址判断函数 多播 ...
- 36 网络相关函数(四)——live555源码阅读(四)网络
36 网络相关函数(四)——live555源码阅读(四)网络 36 网络相关函数(四)——live555源码阅读(四)网络 简介 7)createSocket创建socket方法 8)closeSoc ...
- 32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络
32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络 32 GroupSock(AddressPortLookupTable)——live555 ...
- 31 GroupSock(AddressString)——live555源码阅读(四)网络
31 GroupSock(AddressString)——live555源码阅读(四)网络 31 GroupSock(AddressString)——live555源码阅读(四)网络 简介 Addre ...
随机推荐
- Linux下的网络环境配置
- RGB to HSI, HSI to RGB Conversion Calculator
The RGB color model is an additive system in which each color is defined by the amount of red, green ...
- OBJ Loader Source Code
https://github.com/ChrisJansson/ObjLoader http://www.codeproject.com/Articles/798054/SimpleScene-d-s ...
- js取float型小数点后两位数的方法
四舍五入以下处理结果会四舍五入:' var num =2.446242342; num = num.toFixed(2); // 输出结果为 2.45 不四舍五入以下处理结果不会四舍五入:第一种, ...
- php栈数据结构和括号匹配算法
栈,体现的是后进先出,即LIFO.队列,体现的是先进先出,即FIFO. 栈 array_pop() //尾出 array_push() //尾进 或 array_shift()//头进 array_u ...
- JavaScript数据操作--原始值和引用值的操作本质
我的一句话总结:原始值不管是变量赋值还是函数传递都不会改变原值,引用值不管是变量赋值还是函数传递,如果新变量重新赋值,则不会影响原引用值,如新变量是直接操作,就会影响原引用值. 首先明确,值和类型是两 ...
- How to know if file is complete on the server using FTP
This is a very old and well-known problem. There is no way to be absolutely certain a file being wri ...
- 部署Redis for Windows服务
一.环境 Redis Windows 版本:2.8.2104 二.植入Windows服务 > redis-server.exe --service-install redis.window ...
- ng-repeat指令使用详解
ng-repeat指令使用详解 link: function(scope,element,attr) scope.$index: if(scope.$last == true){} attr['mng ...
- winScp如何通过隧道代理进行远程连接
目标机器:a ip为192.168.2.150(内网ip) a.xxx.x.xx(外网ip) 跳板机器:b ip为192.168.2.151(内网ip) b.xxx.xx.xx(外网ip) 目标机 ...