?? mcast.c
字號:
/* mcast.c -- multicast socket setup routines * * This file is part of 'netcast' program, released under BSD License. * (c) 2001-2002 Stanis砤w Pa秌o <staszek@nutki.com>. All rights reserved. */#include <fcntl.h>#include <net/if.h>#include <sys/ioctl.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include "mdist.h"#include "mcast.h"#include "util.h"//! const -- reuse sockets ?int msock_reuse = 1;//! const -- loop mcast packets ?u_char msock_loop = MCAST_LOOP;//! const -- multicast hop limitu_char msock_ttl = MCAST_TTL; /*! gs - packed group address. (Uses port and addr fields) !*/int init_mcast_socket(struct sockaddr_in *gs) { struct ip_mreq mreq; /* multicast request */ int ms; /* multicast socket */ struct sockaddr_in sin; /* address for bind */ u_short msock_port; /* port. taken from gs */ msock_port=ntohs(gs->sin_port); sin = make_addr(0,msock_port); if ((ms = socket(PF_INET, SOCK_DGRAM, 0)) < 0) crit("socket() failed, error allocating multicast socket"); if (setsockopt(ms,SOL_SOCKET,SO_REUSEADDR,&msock_reuse,sizeof(msock_reuse)) < 0) MSG(2,"setsockopt() failed, can't set reuse flag"); if ( bind(ms, (struct sockaddr*) &sin, sizeof(sin)) < 0) crit("bind() error, can't bind mcast socket"); if (setsockopt(ms,IPPROTO_IP,IP_MULTICAST_TTL,&msock_ttl,sizeof(msock_ttl)) < 0) MSG(2,"setsockopt() failed, can't set ttl value"); if (setsockopt(ms,IPPROTO_IP,IP_MULTICAST_LOOP,&msock_loop,sizeof(msock_loop)) < 0) MSG(2,"setsockopt() failed, can't set multicast packet looping"); mreq.imr_interface.s_addr = INADDR_ANY; mreq.imr_multiaddr = gs->sin_addr; MSG(4,"Using multicast address: %s:%d",inet_ntoa(mreq.imr_multiaddr),msock_port); if (setsockopt(ms,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0) crit("setsockopt() failed, can't join multicast group"); return ms;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -