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>