www.delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/1999/01/05/12:42:42

From: luigi AT labinfo DOT iet DOT unipi DOT it (Luigi Rizzo)
Subject: setsockopt problem with IP_MULTICAST_TTL on b19/NT4
5 Jan 1999 12:42:42 -0800 :
Message-ID: <199901050751.IAA02048.cygnus.gnu-win32@labinfo.iet.unipi.it>
To: gnu-win32 AT cygnus DOT com

Hi,

in porting a multicast app from FreeBSD/Linux i have a problem
using setsockopt() to set the TTL of multicast packets. The code
is below, function openssock().  The setsockopt returns with a "Bad
address" error msg. If i omit the setsockpt call the socket works
fine, except that packets are generated with a TTL of 1 (seen from
another machine on the same net running tcpdump).

Any idea ? I even tried to move the setsockopt() call after the
connect() but no success. Perhaps i should bind the socket to a multicast
address before calling the setsockopt ? (i know it does not make
any sense but perhaps the underlying implementation makes some checks
on the socket addresses before allowing multicast options to be used ?)

	thanks
	luigi

-----------------------------------+-------------------------------------
  Luigi RIZZO                      .
  EMAIL: luigi AT iet DOT unipi DOT it        . Dip. di Ing. dell'Informazione
  HTTP://www.iet.unipi.it/~luigi/  . Universita` di Pisa
  TEL/FAX: +39-050-568.533/522     . via Diotisalvi 2, 56126 PISA (Italy)
-----------------------------------+-------------------------------------

int     
openssock(u_int32_t addr, u_int16_t port, int ttl, int unbound)
{       
    int fd;
    struct sockaddr_in sin;
        

    fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (fd < 0)
        return -1;
    if (nonblock(fd) < 0)
        return -1;
        
    if (IN_CLASSD(ntohl(addr))) {
	u_char t;
	t = (ttl > 255) ? 255 : (ttl < 0) ? 0 : ttl;
	if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL,
		(char*)&t, sizeof(t)) < 0) {
	}
    }
    memset((char *)&sin, 0, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_port = port;
    sin.sin_addr.s_addr = addr;
    if (connect(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
        return -1;
    }
    
    return fd ;
}   


-
For help on using this list (especially unsubscribing), send a message to
"gnu-win32-request AT cygnus DOT com" with one line of text: "help".

- Raw text -


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