//獲得sockfd指向的socket的屬性
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
//設置sockfd指向的socket的屬性,成功返回0,失敗返回-1設errno。
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
level :選項級別
optname:選項名
optval:存放選項值的緩沖區地址
optlen:緩沖區長度
廣播即向當前網段的所有主機進行廣播。廣播的信息是在接受方的傳輸層才決定是否被處理,廣播主機的使用當前網段的最大ip地址作為廣播地址,即,xxx.xxx.xxx.255,而255.255.255.255在所有網段都是廣播地址。 只有使用udp套接字才能廣播,而默認設置的socket是不允許發送廣播的,需要setsockopt()進行設置
sockfd=soket();
...
int on = 1;
setsockopt(sockfd,SOL_SOCKKET,SO_BROADCAST,&on,sizeof(on));
...
sendto();
廣播在接收主機的傳輸層才會決定是否處理,如果很多主機都是不處理,這種廣播風暴無疑會大大的占用帶寬並增加主機負載。組播就可以解決既希望實現"一發多收"又不希望引起"廣播風暴"的一種機制。組播就是只發消息給組內的主機,而不是網段內所有的主機。
//netinet/in.h
struct ip_mreq{
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
};
// 加入多播組
struct ip_mreq mreq;
bzero(&mreq,sizeof(mreq));
mreq.imr_multiaddr.s_addr=inet_addr("224.1.2.2");
mreq.imr_interface.s_addr=htonl(INADDR_ANY);
setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));