您的位置:首页 > 理论基础 > 计算机网络

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的最大值是
25
5,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 传给系统调用的参数不正确。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: