www.delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2009/02/20/12:17:37

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 <victhor_1983 AT yahoo DOT es>
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
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
List-Id: <cygwin.cygwin.com>
List-Unsubscribe: <mailto:cygwin-unsubscribe-archive-cygwin=delorie DOT com AT cygwin DOT com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
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 <string.h>
#include <stdio.h>
#include <netinet/in.h>
#include <sys/socket.h>=20
#include <errno.h>
#include <sys/time.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>


#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/

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019