做模具做什么網(wǎng)站信息流廣告案例
廣播與組播:
廣播:
局域網(wǎng),一個(gè)人發(fā)所有人都能收(服務(wù)器找客戶端),(發(fā)給路由器的廣播地址后后路由器自動(dòng)給所有人發(fā),可用于服務(wù)器找客戶端)
只能udp來做
setsocketopt:
int setsockopt(SOCKET s, int level, int optname,
?? ??? ?const char FAR *optval, int optlen);
?? ??? ?
sock:將要被設(shè)置或者獲取選項(xiàng)的套接字。
level:選項(xiàng)所在的協(xié)議層。
level指定控制套接字的層次.可以取三種值:
1)SOL_SOCKET:通用套接字選項(xiàng).
2)IPPROTO_IP:IP選項(xiàng).
3)IPPROTO_TCP:TCP選項(xiàng).
optname:需要訪問的選項(xiàng)名。
參數(shù)很多,不一一列舉,主要使用SO_BROADCAST 廣播(只能選用UDP,使用TCP時(shí)沒反應(yīng))
optval:對(duì)于getsockopt(),指向返回選項(xiàng)值的緩沖。對(duì)于setsockopt(),指向包含新選項(xiàng)值的緩沖。
(一般置1打開,0關(guān)閉)(需要int on)
optlen:現(xiàn)選項(xiàng)的長(zhǎng)度(sizeof(on))
返回值:
成功執(zhí)行時(shí),返回0。失敗返回-1,errno被設(shè)為以下的某個(gè)值
EBADF:sock不是有效的文件描述詞
EFAULT:optval指向的內(nèi)存并非有效的進(jìn)程空間
EINVAL:在調(diào)用setsockopt()時(shí),optlen無效
ENOPROTOOPT:指定的協(xié)議層不能識(shí)別選項(xiàng)
ENOTSOCK:sock描述的不是套接字
?發(fā)送方:(發(fā)給路由器看)
廣播地址:1.255.255.255.255
? ? ? ? ? 2.本機(jī)最后一位最大的IP地址(連接到局域網(wǎng)后,前三段是一樣的,
?? ??? ? ?最后一位一般為255)
步驟--》1.開廣播開關(guān)(setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));? ?)
? ? ? ? ? ? ? 2.發(fā)給廣播地址(sendto(sockfd,buf,strlen(buf),0,(SA)&all,sizeof(all)))
接收方:
1.bind接口地址
2.recv接收即可
?
組播:
接收方:
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
bind端口
recv接收即可??
接收方:
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
bind端口
recv接收即可
需要選定一個(gè)組播地址
D類:?? ?組播和廣播
?? ??? ?224.0.0.0 - 239.255.255.255
?? ??? ?192.168.0.255 - 255.255.255.255
?? ??? ?235.1.2.3
?? ??? ?192.168.1.0?
?? ??? ?192.168.0.1 ? 網(wǎng)關(guān)
?? ??? ?192.168.1.255 廣播?
?? ??? ?
組播地址結(jié)構(gòu)體:
struct ip_mreqn {
? ? ? ? ? ? ? ?struct in_addr imr_multiaddr; /* 組播地址 */
? ? ? ? ? ? ? ?struct in_addr imr_address; ? /* 本機(jī)IP地址 */(可寫INADDR_ANY(值為0.0.0.0),
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?代表監(jiān)聽本機(jī)所有端口,
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?一般用來表示本機(jī)地址)
? ? ? ? ? ? ? ?int ? ? ? ? ? ?imr_ifindex; ? /* 接口索引 */(網(wǎng)卡,例如ens33,
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?可寫0,代表任意一塊網(wǎng)卡)
? ? ? ? ? ?};
發(fā)送方
2.發(fā)給組播地址即可
接收方:
1.bind組播接口地址
2.利用組播地址結(jié)構(gòu)體將本機(jī)關(guān)聯(lián)進(jìn)組播地址
struct ip_mreqn multiaddr;multiaddr.imr_multiaddr.s_addr = inet_addr(MUTIL_ADDR);multiaddr.imr_address.s_addr = INADDR_ANY;
3.開開關(guān):setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,?
&multiaddr,sizeof(multiaddr));? //第二個(gè)參數(shù)選擇ip選項(xiàng),IP_ADD_MEMBERSHIP加入組播組
4.接收:recvfrom(sockfd, buf, sizeof(buf), 0, (SA)&sendaddr, &len);