40 网络相关函数(八)——live555源码阅读(四)网络
2015-08-17 16:18
627 查看
40 网络相关函数(八)——live555源码阅读(四)网络
40 网络相关函数(八)——live555源码阅读(四)网络简介
15)writeSocket向套接口写数据
TTL的概念
函数sendto
函数原型
函数说明
参数说明:
返回值
错误代码
本文由乌合之众 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 传给系统调用的参数不正确。
相关文章推荐
- 39 网络相关函数(七)——live555源码阅读(四)网络
- android中Post方式发送HTTP请求
- Android-使用HttpClient框架提交数据(get/post)
- 关闭防火墙解决httpclient.execute长时间停滞
- hdu 4274 2012长春赛区网络赛 树形dp ***
- linux网络设备驱动学习
- java HttpSessionListener监听在线人数操作session
- TCP/IP详解 卷I:协议 のARP
- Android动画学习Demo(3) 关于Property Animation的TimeInpolator和TypeEvaluatorhttp://blog.csdn.net/linmiansheng
- WEB服务器、应用程序服务器、HTTP服务器区别
- 38 网络相关函数(六)——live555源码阅读(四)网络
- 如何在ubuntu 15.04服务器上配置SNMPv3?
- Tcp 数据对象传输接口对象设计
- LINUX使用FTP搭建网络版YUM源
- c 语言实现httpclient端的post,get, delete
- ZOJ 3818 Pretty Poem (2014年牡丹江赛区网络赛J题)
- 设计管理员表;webservice用于网络安全的高端内提供服务的
- 黑马程序员--java基础--网络编程TCP传输
- HTTP 状态消息和六种请求方式
- Alamofire-Swift Networking网络库