第四天网络编程笔记
【1】网络套接字的属性
getsockopt()/setsockopt() 获取/设置一个套接口选项
int getsockopt(int sockfd, int level, int optname,
void *optval, socklen_t *optlen);
功能:获取网络套接字的属性
参数:sockfd 网络套接字
level SOL_SOCKET (应用层API LEVEL)
IPPROTO_TCP (TCP 层)
IPPROTO_IP (IP层)
optname 操作的名字
SO_DEBUG
SO_BROADCAST 广播
SO_REUSEADDR 重复绑定
SO_SNDBUF 发送缓存区大小
SO_RCVBUF 接收缓存区的大小
optval 操作的值
optlen 操作值的大小
返回值:成功0,出错 -1
int setsockopt(int sockfd, int level, int optname,
const void *optval, socklen_t optlen);
功能:设置网络套接字的属性
参数:sockfd 网络套接字
level SOL_SOCKET (应用层API LEVEL)
IPPROTO_TCP (TCP 层)
IPPROTO_IP (IP层)
optname 操作的名字
SO_DEBUG
SO_BROADCAST 广播
SO_REUSEADDR 重复绑定
SO_SNDBUF 发送缓存区大小
SO_RCVBUF 接收缓存区的大小
SO_RCVTIMEO 超时检测
optval 操作的值
optlen 操作值的大小
返回值:成功0,出错 -1
【2】网络的超时检测
超时检测的必要性
避免进程在没有数据时无限制地阻塞
当设定的时间到时,进程从原操作返回继续运行
1-- 使用setsockopt 修改套接字的属性,设置超时时间值
struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
if(setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0)
{
err_log("fail to setsockopt.");
}
一次设置终身有效。
2-- 使用select 实现超时检测
struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
select(maxfd+1, &readfds, NULL, NULL, &tv)
描述:select 阻塞等待文件描述符,准备就绪。如果在规定的时间内,
没有文件描述符准备就绪,那么立刻返回,返回值为0
如果在规定的时间内,有文件描述符准备就绪,那么也立刻返回
返回值代表已经准备就绪的文件描述符的个数。
并且将没有准备的就绪文件描述符,从集合中清除掉。
注意:tv的值,在每次执行完select 之后,被清零了。
3-- alarm 闹钟定时器
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
The sigaction structure is defined as something like:
struct sigaction {
void (*sa_handler)(int); // 信号处理函数
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags; // 信号属性标记位,SA_RESTART (系统调用自重启属性)
void (*sa_restorer)(void);
};
系统调用自重启属性:默认信号函数处理完毕之后,会回到原来的程序被打断的地方重新执行。
读--改---写
struct sigaction act;
sigaction(SIGALRM, NULL, &act);
act.sa_handler = handler;
act.sa_flags &= ~SA_RESTART;
sigaction(SIGALRM, &act, NULL);
66 alarm(5);
【3】广播
前面介绍的数据包发送方式只有一个接受方,称为单播
如果同时发给局域网中的所有主机,称为广播
只有用户数据报(使用UDP协议)套接字才能广播
广播地址
以192.168.1.0 (255.255.255.0) 网段为例,最大的主机地址192.168.1.255代表该网段的广播地址
发到该地址的数据包被所有的主机接收
255.255.255.255在所有网段中都代表广播地址
广播发送者流程:
1-- 创建用户数据报套接字
2-- 缺省创建的套接字不允许广播数据包,需要设置属性
setsockopt可以设置套接字属性
3-- 填充网络信息结构体(广播地址和端口)
4--发送数据包
广播接收者流程:
1-- 创建用户数据报套接字
2-- 绑定广播的IP地址和端口
绑定的端口必须和发送方指定的端口相同
3-- 等待接收数据