bind(2) na neexistujici rozhrani

Jirka Kosina jikos na jikos.cz
Pondělí Listopad 26 18:36:36 CET 2001


On Mon, 26 Nov 2001, Jan Kasprzak wrote:

> : Rekl bych, ze jadro skutecne nema duvod bind() na nelokalni adresu 
> : nepovolit, a mam pocit, ze to ani nedela:
> : bind(8, {sin_family=AF_INET, sin_port=htons(1234),sin_addr=inet_addr("0.49.19.198")}}, 16) = 0
> 	Hmm. Napsal jsem si testovaci program, a bind() mi vraci
> -1, "Cannot assign requested address". A zkousel jsem stracovat
> xinetd, a dela to to same. Kernel 2.4.14.

Tak to je opravdu zajimave.

[jikos na twin q]$ cat q.c
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>

 main(int argc, char *argv[])
 {
     int    sockfd;
     struct sockaddr_in serv_addr;
     int opt=1;

     srandom(time(0));
     if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        exit(-1);


     if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt))!=0)
        exit(-1);

     bzero((char *) &serv_addr, sizeof(serv_addr));
     serv_addr.sin_family      = AF_INET;
     serv_addr.sin_addr.s_addr = htonl(random()/1000); //nahodne cislo ;)
     serv_addr.sin_port        = htons(1234);

     if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 
0)
        exit(-1);

 }

[jikos na twin q]$ cc q.c
[jikos na twin q]$ strace ./a.out 2> x.x
[jikos na twin q]$ cat x.x | grep bind
bind(4, {sin_family=AF_INET, sin_port=htons(1234), 
sin_addr=inet_addr("0.10.132.186")}}, 16) = 0

Kdyz to poustim vickrat, snazi se to tam dosadit ruzne IP adresy a pokazde 
to uspeje.

Ted jsem to zkousel na 2.4.9, muzu zkusit i na jinych, pripadne se zavrtat 
nekam do zdrojaku jadra.

Je to divne.

Nebo jsem spravne nepochopil problem? ;)

-- 
JiKos.




Další informace o konferenci Linux