mcast.c

来自「一个C编写网络广播的程序」· C语言 代码 · 共 62 行

C
62
字号
/* 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 + =
减小字号Ctrl + -
显示快捷键?