multicast.c
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:3k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: multicast.c,v 1.7 1998/07/22 20:37:36 wessels Exp $
  3.  *
  4.  * DEBUG: section 7     Multicast
  5.  * AUTHOR: Martin Hamilton
  6.  *
  7.  * SQUID Internet Object Cache  http://squid.nlanr.net/Squid/
  8.  * ----------------------------------------------------------
  9.  *
  10.  *  Squid is the result of efforts by numerous individuals from the
  11.  *  Internet community.  Development is led by Duane Wessels of the
  12.  *  National Laboratory for Applied Network Research and funded by the
  13.  *  National Science Foundation.  Squid is Copyrighted (C) 1998 by
  14.  *  Duane Wessels and the University of California San Diego.  Please
  15.  *  see the COPYRIGHT file for full details.  Squid incorporates
  16.  *  software developed and/or copyrighted by other sources.  Please see
  17.  *  the CREDITS file for full details.
  18.  *
  19.  *  This program is free software; you can redistribute it and/or modify
  20.  *  it under the terms of the GNU General Public License as published by
  21.  *  the Free Software Foundation; either version 2 of the License, or
  22.  *  (at your option) any later version.
  23.  *  
  24.  *  This program is distributed in the hope that it will be useful,
  25.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  26.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27.  *  GNU General Public License for more details.
  28.  *  
  29.  *  You should have received a copy of the GNU General Public License
  30.  *  along with this program; if not, write to the Free Software
  31.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
  32.  *
  33.  */
  34. #include "squid.h"
  35. int
  36. mcastSetTtl(int fd, int mcast_ttl)
  37. {
  38. #ifdef IP_MULTICAST_TTL
  39.     char ttl = (char) mcast_ttl;
  40.     if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, 1) < 0)
  41. debug(50, 1) ("comm_set_mcast_ttl: FD %d, TTL: %d: %sn",
  42.     fd, mcast_ttl, xstrerror());
  43. #endif
  44.     return 0;
  45. }
  46. void
  47. mcastJoinGroups(const ipcache_addrs * ia, void *datanotused)
  48. {
  49. #ifdef IP_MULTICAST_TTL
  50.     int fd = theInIcpConnection;
  51.     struct ip_mreq mr;
  52.     int i;
  53.     int x;
  54.     char c = 0;
  55.     if (ia == NULL) {
  56. debug(7, 0) ("comm_join_mcast_groups: Unknown hostn");
  57. return;
  58.     }
  59.     for (i = 0; i < (int) ia->count; i++) {
  60. debug(7, 10) ("Listening for ICP requests on %sn",
  61.     inet_ntoa(*(ia->in_addrs + i)));
  62. mr.imr_multiaddr.s_addr = (ia->in_addrs + i)->s_addr;
  63. mr.imr_interface.s_addr = INADDR_ANY;
  64. x = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
  65.     (char *) &mr, sizeof(struct ip_mreq));
  66. if (x < 0)
  67.     debug(7, 1) ("comm_join_mcast_groups: FD %d, [%s]n",
  68. fd, inet_ntoa(*(ia->in_addrs + i)));
  69. x = setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &c, 1);
  70. if (x < 0)
  71.     debug(7, 1) ("Can't disable multicast loopback: %sn", xstrerror());
  72.     }
  73. #endif
  74. }