歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux IPC socket 廣播,組播

Linux IPC socket 廣播,組播

日期:2017/3/1 9:10:13   编辑:Linux編程

getsockopt()/setsockopt()

//獲得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 :選項級別

  • SOL_SOCKET:指定設置屬性在socket API層次,即通用socket選項
  • IPPROTO_IP:IP選項。
  • IPPROTO_TCP:TIP選項。

optname:選項名

  • SO_BROADCAST:廣播

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

Copyright © Linux教程網 All Rights Reserved