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