第四天网络编程笔记

【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-- 等待接收数据

posted @ 2016-06-30 09:09  自由石匠  阅读(148)  评论(0编辑  收藏  举报