bind() failed: EADDRNOTAVAIL

ibotty bsd at ibotty.net
Mon Nov 10 17:18:15 PST 2003


i was just playing around with bulk.fefe.de/scalability benchmarks and
noticed one (maybe strange) thing.
(more to come, but i still have to parse the results..., too tired, i guess)

in bindbench:
bind(2) returns EADDRNOTAVAIL.
( bind(3980, sockaddr_in with sin_addr.s_addr = INADDR_ANY and sin_port = 0)
always fails with above error.
btw, i got the socket with socket(PF_INET,SOCK_STREAM,IPPROTO_TCP), all
previous binds(..3979) succeeded)

this may well be a sysctl or configuration related problem, although i doubt
it.


btw: after reboot, the socket is 3981, but nothing else is different.

attached is a (very) simple c file, which just sockets and binds, until an
error occures (on my system/setup on 3980-3rd run) or you kill it.

(this is basically a copy and inlining of fefes bindbench.c)

~ibotty#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <errno.h>


int main( int, const char **);
void byte_zero(void* out, unsigned long len);

int 
main( int argc, const char ** argv)
{
	int sock, r;
	struct sockaddr_in si;

	while (1)
	{
		sock = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
		byte_zero(&si,sizeof si );
		si.sin_family = AF_INET;
		si.sin_addr.s_addr = INADDR_ANY;
		r = bind( sock, (struct sockaddr*) &si, sizeof si );
		printf( "bind(%i,...) \n", sock );
		if ( r == -1 )
		{
			printf( strerror(errno) );
			break;
		}
	}
}

void byte_zero(void* out, unsigned long len) {
  register char* s=out;
  register const char* t=s+len;
  for (;;) {
    if (s==t) break; *s=0; ++s;
    if (s==t) break; *s=0; ++s;
    if (s==t) break; *s=0; ++s;
    if (s==t) break; *s=0; ++s;
  }
}





More information about the Kernel mailing list