X-Recipient: archive-cygwin AT delorie DOT com X-SWARE-Spam-Status: No, hits=1.0 required=5.0 tests=AWL,BAYES_00,DNS_FROM_OPENWHOIS,J_CHICKENPOX_66,SPF_HELO_PASS,SPF_PASS,WHOIS_MYPRIVREG X-Spam-Check-By: sourceware.org Message-ID: <22123508.post@talk.nabble.com> Date: Fri, 20 Feb 2009 09:17:20 -0800 (PST) From: victhor_1983 To: cygwin AT cygwin DOT com Subject: Re: Problem Adding Membership Multicast Errno 22 In-Reply-To: <20090220125534.GD24834@calimero.vinschen.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable References: <22119431 DOT post AT talk DOT nabble DOT com> <20090220124814 DOT GC24834 AT calimero DOT vinschen DOT de> <20090220125534 DOT GD24834 AT calimero DOT vinschen DOT de> X-IsSubscribed: yes Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com On Feb 20 13:48, Corinna Vinschen wrote: > On Feb 20 04:05, victhor_1983 wrote: > > status=3D setsockopt(Descriptor, IPPROTO_IP, IP_ADD_MEMBERSHIP, &Multi= c, > > sizeof(Multic)); > > if (status<0){ > > printf("Fallo al a=C3=B1adir el grupo de Multicast, codigo %= i\n", > > errno); > > } >=20 > I'm sorry, I can't tell you why this doesn't work. Cygwin's setsockopt > function is basically just a shim between application and Winsock's > setsockopt call. It only performs special actions on a very limited > set of options, only two actually: (SOL_SOCKET, SO_REUSEADDR) and > (IPPROTO_IP, IP_TOS). I'm also quite multicast illiterate. Is it > possible that you have to use the IP_MULTICAST_IF option on Windows > before you can use IP_ADD_MEMBERSHIP?!? >Here's one idea: Is it possible that your application includes >winsock.h? If so, don't do that, use the POSIX headers for socket and >ip stuff. Winsock.h is the WInsock specific header file for >applications using the old Winsock 1.x API. In that API, >IP_ADD_MEMBERSHIP is defined as the value 5. >However, the newer Winsock 2.x API, which is used by Cygwin under the >hood as well, defines IP_ADD_MEMBERSHIP as the value 12. So, if there's >any chance that you're including the winsock.h header, remove it and >only use Cygwin's header files, not the Winsock specifc header files. Thanks for the idea. Yes, I read something similar in a post related to multicast in this same forum. However, I am not using windows headers, since I migrated my code from Ubuntu. I also tried defining the value of IP_ADD_MEMBERSHIP myself, and it checks with value 12, just as you say. However, I still get the error. I do the binding right after the setsockopt, but the result is the same if I do it before. In both cases, the setsockopt() returns an errno=3D22, and the binding returns an errno=3D125. It is a real mistery, because I know the IP interface I associate to the multicast group exists and works, since I use it without a problem in unicast sockets in other programs. I have the feeling the problem is in the struct ip_mreg Multic or in sizeof(Multic), but I cannot figure out why or how to solve it. I will keep looking into it. Just in case, I post the whole code here: #include #include #include #include =20 #include #include #include #include #include #define SIGALRM 14 void salir() { exit(NULL); } int main (void) { int Descriptor, Descriptor2, status; struct sockaddr_in Direccion, Direccion2; unsigned short Puerto; struct ip_mreq Multic; Descriptor=3Dsocket(AF_INET,SOCK_DGRAM,0); Puerto=3D12100; Direccion.sin_family=3DAF_INET; Direccion.sin_port=3Dhtons(Puerto);//Puerto->s_port; Direccion.sin_addr.s_addr=3Dinet_addr("224.0.22.1");//("138.4.32.34"); memset(&(Direccion.sin_zero),'\0',8);=20=20=20 Direccion2.sin_family=3DAF_INET; Direccion2.sin_port=3Dhtons(Puerto);//Puerto->s_port; Direccion2.sin_addr.s_addr=3Dhtonl(INADDR_ANY);//inet_addr("138.4.32.34");/= /("138.4.32.34"); memset(&(Direccion2.sin_zero),'\0',8);=20=20=20 status=3Dbind(Descriptor,(struct sockaddr *)&Direccion, sizeof(struct sockaddr));=09 if (status<0){ printf("Fallo al realizar binding, codigo %i\n", errno); } =09 Multic.imr_multiaddr.s_addr=3Dinet_addr("224.0.22.1"); Multic.imr_interface.s_addr=3Dhtonl(INADDR_ANY);//inet_addr("138.4.32.34"); status=3D setsockopt(Descriptor, IPPROTO_IP, IP_ADD_MEMBERSHIP, &Multic, sizeof(Multic)); if (status<0){ printf("Fallo al a=C3=B1adir el grupo de Multicast, codigo %i\n", errno); } signal (SIGINT, salir); signal (SIGALRM, SIG_IGN); =09 =09 =09 =09 return 0;=09=09 } Maybe the error is in some other part. Thanks again for your insight and your help. Victor --=20 View this message in context: http://www.nabble.com/Problem-Adding-Membersh= ip-Multicast-Errno-22-tp22119431p22123508.html Sent from the Cygwin list mailing list archive at Nabble.com. -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/