套接字属性设置|广播|主播
获取和设置套接字属性
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int getsockopt(int sockfd, int level, int optname,
void *optval, socklen_t *optlen);
参数:
sockfd:套接字
level:
SOL_SOCKET: 通用套接字层
IPPROTO_IP: IP层
IPPROTO_TCP: TCP层
optname:
套接字属性设置对应的功能选项,一般填对应宏
optval:
获取套接字属性对应的值的地址
optlen:
optval值的长度的地址
//设置套接字属性
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
设置属性表:level
SOL_SOCKET
SO_BROADCAST 允许发送广播数据 int
SO_DEBUG 循序调试 int
SO_DONTROUTE 不查找路由 int
SO_ERROR 获的套接字错误 int
SO_KEEPALIVE 保持连接 int
SO_LINGER 延迟关闭连接 struct linger
SO_OOBINLINE 带外数据放入正常数据流 int
SO_RCVBUF 接收缓冲区大小 int
SO_SNDBUF 发送缓冲区大小 int
SO_RCVLOWAT 接收缓冲区下限 int
SO_SNDWAIT 发送缓冲区下限 int
SO_RCVTIMEO 接收超时 struct timeval
SO_SNDTIMEO 发送超时 struct timeval
SO_REUSEADDR 允许重用本机地址和端口 int
SO_TYPE 获得套接字类型 int
SO_BSDCOMPAT 与BSD系统兼容 int
===================================================
IPPROTO_IP
------------------------------------------------------
IP_ADD_MEMBERSHIP 加入到组播组中 struct ip_mreq
IP_MULTICAST_IF 允许开启组播报文的接口 struct ip_mreq
超时检测
//1、使用alarm信号和signal函数实现超时检测
alarm(10);
signal(14, func);
void func()
{
//功能实现;
}
//2、IO多路复用select、poll、epoll通过设置函数中的参数 timeout实现
struct timeval mt = {5, 0};
select(maxfd, &rfds, NULL, NULL, &mt);
//3、通过设置套接字属性完成超时检测
struct timeval mt = {5, 0};
int len = sizeof(mt);
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &mt, len);
超时检测
(1)signal捕获alarm信号
(2)IO多路复用
(3)设置套接字属性
广播
发送方 向当前IP的广播地址发送数据,广播地址将接收的数据转发给当前网络号下的所有主机
服务器流程:
//1、创建套接字
socket();
//2、绑定IP地址和端口号 (绑定广播IP)
bind();
//3、收发数据
sendto()/recvfrom();
//4、关闭套接字
close();
客户端流程
//1、创建套接字
socket();
//2、设置套接字属性,使其允许发送广播数据
setsockopt(); //SO_BROADCAST
//3、发送数据 -- 向广播地址发送
sendto();
//4、关闭套接字
close();
组播
先将接收方的ip加入到指定的组播组中去,发送方向组播组中发送数据,组播ip负责将接收的内容转发给当前组播组中的所有ip
服务器流程:
//1、创建套接字
socket();
//2、设置套接字属性,将当前IP加入到组播组中去
setsockopt(); //IP_ADD_MEMBERSHIP
//3、绑定IP地址和端口号 (绑定组播IP)
bind();
//4、接收数据
recvfrom();
//5、关闭套接字
close();
struct ip_mreq {
struct in_addr imr_multiaddr; /* IP multicast address of group */
struct in_addr imr_interface; /* local IP address of interface */
};
用法:
struct ip_mreq my_group;
my_group.imr_multiaddr.s_addr = inet_addr("239.10.0.1");
my_group.imr_interface.s_addr = inet_addr("192.168.12.15");
客户端流程:
//1、创建套接字
socket();
//2、设置套接字属性,允许发送组播数据
setsockopt(); //IP_MULTICAST_IF
//4、发送数据
sendto();
//5、关闭套接字
close();