Tôi có đoạn mã sau đây để nhận được tên máy và địa chỉ IP,lỗi Segmentation khi nhìn lên tên máy chủ và địa chỉ IP
#include <stdlib.h>
#include <stdio.h>
#include <netdb.h> /* This is the header file needed for gethostbyname() */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char *argv[])
{
struct hostent *he;
if (argc!=2){
printf("Usage: %s <hostname>\n",argv[0]);
exit(-1);
}
if ((he=gethostbyname(argv[1]))==NULL){
printf("gethostbyname() error\n");
exit(-1);
}
printf("Hostname : %s\n",he->h_name); /* prints the hostname */
printf("IP Address: %s\n",inet_ntoa(*((struct in_addr *)he->h_addr))); /* prints IP address */
}
Nhưng tôi nhận được một cảnh báo khi biên soạn:
$cc host.c -o host
host.c: In function ‘main’:
host.c:24: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’
Sau đó, có lỗi phân đoạn khi tôi chạy mã:
./host 192.168.1.4
Hostname : 192.168.1.4
Segmentation fault
Lỗi trong mã là gì?
Bạn đang làm điều gì đó khủng khiếp với cấu trúc vô tội. – SLaks
Nhân tiện, bạn thường không nên sử dụng 'gethostbyname' trong mã mới, chủ yếu vì nó không tương thích với IPv6. Bạn nên sử dụng 'getaddrinfo' thay vào đó: http://beej.us/guide/bgnet/output/html/multipage/getaddrinfoman.html –
Điều gì sẽ xảy ra nếu bạn chạy ./host www.stackoverflow.com? Đó là, nếu bạn sử dụng nó với một tên thực tế chứ không phải là một địa chỉ IP. – nsayer