Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 9 Jul 2002 17:05:32 -0700 (PDT)
From:      Don Lewis <dl-freebsd@catspoiler.org>
To:        term@velocitus.net
Cc:        freebsd-net@FreeBSD.ORG
Subject:   Re: Bind to specific address on FreeBSD
Message-ID:  <200207100005.g6A05Wwr005505@gw.catspoiler.org>
In-Reply-To: <B6C2B288BB8D5542AA2485606CD47462125366@exchange.rmci.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On  9 Jul, Chris Given wrote:
> I can't figure out why this code won't bind to 127.0.0.1 on FreeBSD. I get
> an error "Can't assign requested address".
> 

> 	struct sockaddr_in dp;
> 	unsigned long bind_to_addr = inet_addr("127.0.0.1");
> 
> 	sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
> 	if(sock < 0) {
> 		printf("Error socket : %s\n", strerror(errno));
> 		return -1;
> 	}
> 
> 	dp.sin_family = AF_INET;
> 	dp.sin_addr.s_addr = htonl(bind_to_addr);
> 	dp.sin_port = htons(1234);

In addition to the byte order problem you haven't initialized the
sin_len member of dp and cleared the sin_zero member.  Typically code
will zero out the entire structure to clear any padding or fields that
can default to zero before it stores the desired data in the structure.
Here's an example I found in rwhod:

        struct sockaddr_in sin;
        ...
        memset(&sin, 0, sizeof(sin));
        sin.sin_len = sizeof(sin);
        sin.sin_family = AF_INET;
        sin.sin_port = sp->s_port;
        if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
                syslog(LOG_ERR, "bind: %m");
                exit(1);
        }
       





To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-net" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200207100005.g6A05Wwr005505>