Date: Thu, 17 Dec 2009 21:28:14 +0100 From: Pieter de Goeje <pieter@degoeje.nl> To: freebsd-questions@freebsd.org Cc: Dex Nada <dxnada@gmail.com> Subject: Re: Joining multiple Multicast Streams Message-ID: <200912172128.14426.pieter@degoeje.nl> In-Reply-To: <ce0994f50912171045g41b9769eqfb26d714224826de@mail.gmail.com> References: <ce0994f50912171045g41b9769eqfb26d714224826de@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thursday 17 December 2009 19:45:24 Dex Nada wrote: > Hi: > > I am writing an application that joins a multicast stream on a specific UDP > port. But when I run more than one instance of the same application, the > second instance complains that the port is already in use. For example if I > join stream 229.10.10.133:2000 on one instance and 229.10.10..134:2000 on > another instance, the second one fails to join - I can however join it if I > kill the first instance. I have compiled that application with SOCKET_REUSE > option, but I wonder if I need to enable/recompile-with any special > multicast kernel option for this to work. I do not have this problem when I > run this code on Linux (Ubuntu 9.10) but I really want to get this working > on FreeBSD. > > Thanks in advance. > > -DxN Try SO_REUSEPORT. The manpage (getsockopt(2)) specifically mentions multiple listeners for the same multicast stream. The following pseudo C seems to work fine: int reuseport = 1; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(port); mreq.imr_multiaddr.s_addr = maddr; mreq.imr_interface.s_addr = INADDR_ANY; int fd = socket(AF_INET, SOCK_DGRAM, 0); setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &reuseport, sizeof(reuseport)); bind(fd, (struct sockaddr *)&addr, sizeof(addr)); setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); recvfrom(fd, ....); Good luck, Pieter de Goeje
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200912172128.14426.pieter>