套接字属性设置|广播|主播

获取和设置套接字属性

#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();