我正在编写代码来查找Web服务器。它在C。
我有这个
sprintf(pre_ip, "%d.%d.%d.%d", num1, num2, num3, num4);
num1-4是一个类似于1.1.1.1的ip。这部分有效..
he = gethostbyname(pre_ip);
这应该将struct hostent *he;
分配给ip ..
但这不起作用..
server_info.sin_addr = *((struct in_addr *)he->h_addr);
connect(socket_fd, (struct sockaddr *)&server_info, sizeof(struct sockaddr));
以下是整个代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
//lol220
int main(int argc, char *argv[])
{
struct sockaddr_in server_info;
struct hostent *he;
int socket_fd,num;
char buffer[1024];
char buff[1024];
if (argc != 1) {
fprintf(stderr, "Usage: client hostname\n");
exit(1);
}
if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0))== -1) {
fprintf(stderr, "Socket Failure!!\n");
exit(1);
}
memset(&server_info, 0, sizeof(server_info));
server_info.sin_family = AF_INET;
server_info.sin_port = htons(80);
//-------------------------------looooop------------------------
int num1 = 1;
int num2 = 1;
int num3 = 1;
int num4 = 1;
int done = 1;
char ip;
char pre_ip[256];
while(done){
if(num4 == 256){
num4 = 1;
num3++;
}
if(num3 == 256){
num3 = 1;
num2++;
}
if(num2 == 256){
num2 = 1;
num1++;
}
if(num1 == 255 && num2 == 255 && num3 == 255 && num4 == 255){
done = 0;
}
// MOST LIKELY NON WORKING PART
sprintf(pre_ip, "%d.%d.%d.%d", num1, num2, num3, num4);
printf("%s\n", pre_ip);
he = gethostbyname(pre_ip);
server_info.sin_addr = *((struct in_addr *)he->h_addr);
if (connect(socket_fd, (struct sockaddr *)&server_info, sizeof(struct sockaddr))<0) {
printf("Could not connect to %s", he);
}
else{
printf("Could connect to %s", he);
}
// MOST LIKELY NON WORKING PART
num4++;
}
return 0;
}
它汇编得很好。
打印&#34; 1.1.1.1&#34;然后它说&#34;无法连接到8T1.1.1.2&#34;这意味着he == "8T1.1.1.2
。
答案 0 :(得分:0)
在此行中打印ip时:
printf("Could not connect to %s", he);
你将struct hostent
投射到char *
,这会在ip之前引出奇数字符。实际上,使用ip直接连接服务器没问题,不需要gethostbyname
。如果你真的想尝试这个功能,就像这样:
bzero(&server_info, sizeof(server_info));
const char *ip = inet_ntoa(server_info.sin_addr);
...
printf("Could not connect to %s", ip);
答案 1 :(得分:0)
尝试更像这样的东西:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
struct sockaddr_in server_info;
int socket_fd;
if (argc != 1) {
fprintf(stderr, "Usage: client hostname\n");
exit(1);
}
if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0))== -1) {
fprintf(stderr, "Socket Failure!!\n");
exit(1);
}
memset(&server_info, 0, sizeof(server_info));
server_info.sin_family = AF_INET;
server_info.sin_port = htons(80);
for (uint32_t ip = 0x01010101; ip != 0xFFFFFFFF; ++ip) {
server_info.sin_addr.s_addr = htonl(ip);
printf("Connect to %s: ", inet_ntoa(server_info.sin_addr));
if (connect(socket_fd, (struct sockaddr *)&server_info, sizeof(server_info)) == -1) {
printf("Failed\n");
}
else {
printf("Success\n");
close(socket_fd);
if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
fprintf(stderr, "Socket Failure!!\n");
exit(1);
}
}
}
return 0;
}