在C中为字符串分配字符串

时间:2014-09-01 02:16:08

标签: c sockets compiler-errors webserver

我正在编写代码来查找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

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;
}