這個shell腳本編譯正確的C代碼,我相信會做你想讓它什麼:
==========
destination : localhost:80
host's official name: localhost
IP address : 127.0.0.1
connection established on file descriptor 3
==========
destination : localhost:81
host's official name: localhost
IP address : 127.0.0.1
connect(): Connection refused
==========
destination : 127.0.0.1:80
host's official name: 127.0.0.1
IP address : 127.0.0.1
connection established on file descriptor 5
==========
destination : tiger:80
host's official name: tiger.x441afea5.org
alias : tiger
IP address : 10.0.0.1
connection established on file descriptor 6
==========
destination : www.google.com:80
host's official name: www.l.google.com
alias : www.google.com
IP address : 74.125.229.50
connection established on file descriptor 7
IP address : 74.125.229.52
connection established on file descriptor 8
IP address : 74.125.229.48
connection established on file descriptor 9
IP address : 74.125.229.49
connection established on file descriptor 10
IP address : 74.125.229.51
connection established on file descriptor 11
希望這有助於:
rm -f 1; cat > 1.c <<EOD; gcc -Wall -Werror 1.c -o 1; ./1
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
void
do_one(char *the_name,int port_number)
{
int my_socket;
char **pointer_pointer;
char answer[INET_ADDRSTRLEN];
struct hostent *returned_host;
struct sockaddr_in outgoing_address;
printf("==========\n");
printf("destination : %s:%d\n",the_name,port_number);
returned_host=gethostbyname(the_name);
if(returned_host==NULL)
{
fprintf(stderr,"error %d\n",h_errno);
return;
}
printf("host's official name: %s\n",returned_host->h_name);
for(pointer_pointer=returned_host->h_aliases;
*pointer_pointer;
pointer_pointer++
)
{
printf("alias : %s\n",*pointer_pointer);
}
for(pointer_pointer=returned_host->h_addr_list;
*pointer_pointer;
pointer_pointer++
)
{
inet_ntop(AF_INET,(void *)*pointer_pointer,answer,sizeof(answer));
printf("IP address : %s\n",answer);
my_socket=socket(AF_INET,SOCK_STREAM,0);
if(my_socket<0)
{
perror("socket()");
return;
}
memset(&outgoing_address,0,sizeof(outgoing_address));
outgoing_address.sin_family=AF_INET;
outgoing_address.sin_port=htons(port_number);
memmove(&outgoing_address.sin_addr,
*pointer_pointer,
sizeof(&outgoing_address.sin_addr)
);
if(connect(my_socket,(struct sockaddr*)&outgoing_address,sizeof(outgoing_address)))
{
perror("connect()");
return ;
}
printf("connection established on file descriptor %d\n",my_socket);
}
} /* do_one() */
int
main(void)
{
do_one("localhost",80);
do_one("localhost",81);
do_one("127.0.0.1",80);
do_one("tiger",80);
do_one("www.google.com",80);
return 0;
} /* main() */
EOD
我得到的是這樣的輸出。
這實際上很不錯,直接來自記憶。我無法從這樣的記憶中做到。必須記住socket()調用,並在填充sockaddr_in結構之前將其清零,因爲有些字段不會意外設置爲非零。 – 2011-03-26 22:13:55
'gethostbyname'已被棄用,並且即將過渡到ipv6將會帶來極大的問題。 *總是*使用現代的getaddrinfo接口。 – 2011-03-27 00:47:43
是的,這是真的。我同意那個。 – 2011-03-27 03:57:45