通过sockaddr_in gethostname等将主机转换为ip

我需要帮助将hostname转换为ip并插入sockaddr_in-> sin_addr才能分配给char。 例如我输入:localhost,它给了我127.0.0.1

我找到了代码,但我不知道为什么它给了我错误的数字

//--- #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  //--- ///CZY WPISANO HOST struct in_addr inaddr; inaddr.s_addr = inet_addr(argv[1]); if( inaddr.s_addr == INADDR_NONE) //if sHost is name and not IP { struct hostent* phostent = gethostbyname( argv[1]); if( phostent == 0) bail("gethostbyname()"); if( sizeof(inaddr) != phostent->h_length) bail("problem z inaddr"); // error something wrong, puts(argv[1]); inaddr.s_addr = *((unsigned long*) phostent->h_addr); //strdup( inet_ntoa(inaddr)); srvr_addr = inet_ntoa(adr_srvr.sin_addr); puts(srvr_addr); } 

我也写了自己的代码,但我不知道如何从sockaddr转移到sockaddr_in数据:

 ///CZY WPISANO HOST if(argv[1][0]>=(char)'a' && argv[1][0]h_addr_list; } 

adr_srvr是char *类型

我真的需要帮助,谢谢!

尝试这样的事情:

  struct hostent *he; struct sockaddr_in server; int socket; const char hostname[] = "localhost"; /* resolve hostname */ if ( (he = gethostbyname(hostname) ) == NULL ) { exit(1); /* error */ } /* copy the network address to sockaddr_in structure */ memcpy(&server.sin_addr, he->h_addr_list[0], he->h_length); server.sin_family = AF_INET; server.sin_port = htons(1337); /* and now you can connect */ if ( connect(socket, (struct sockaddr *)&server, sizeof(server) ) { exit(1); /* error */ } 

我直接从我的记忆中编写了这段代码,所以我无法保证它能正常工作,但我很确定它应该没问题。

这个shell脚本编译正确的C代码,我相信它会做你想要的:

 rm -f 1; cat > 1.c < #include  #include  #include  #include  #include  #include  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 

我得到的输出是这样的:

 ========== 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 

希望这可以帮助。