предупреждение: передача аргумента 2 'inet_aton' из несовместимого типа указателя ........ ОШИБКА - PullRequest
1 голос
/ 29 мая 2019

Я не знаю, что означает эта ошибка и что нужно сделать, чтобы ее исправить.

Я следовал учебникам по Sock) и программированию на C для начинающих |Часть 2 от Eduonix на Youtube, но я не смог ничего запустить от этого парня, код взят из его урока.

Если кто-то может помочь мне понять, что означает эта ошибка, ичто сделать, чтобы это исправить?

Вот ошибка:

inet_aton(address, &remote_address.sin_addr.s_addr);
                   ^

[1007:1003 0:6758] 09:30:39 Wed May 29 [kristjan@Kundrum:pts/5 +1] ~/C_Programming
$ gcc http_client_tcp.c -o http_client_tcp
http_client_tcp.c: In function ‘main’:
http_client_tcp.c:24:24: warning: passing argument 2 of ‘inet_aton’ from incompatible pointer type [-Wincompatible-pointer-types]
     inet_aton(address, &remote_address.sin_addr.s_addr);
                        ^
In file included from http_client_tcp.c:8:0:
/usr/include/arpa/inet.h:73:12: note: expected ‘struct in_addr *’ but argument is of type ‘in_addr_t * {aka unsigned int *}’
 extern int inet_aton (const char *__cp, struct in_addr *__inp) __THROW;
            ^~~~~~~~~

Я использую растяжение и кодирование Debian Linux 9.9 в коде Visual Studioно ошибка не появляется в редакторе / отладчике визуального кода, только если я компилирую в оболочке.

Вот код:

#include <stdio.h>
#include <stdlib.h>

#include <sys/socket.h>
#include <sys/types.h>

#include <netinet/in.h>
#include <arpa/inet.h>

#include <unistd.h> // for close

int main(int argc, char *argv[])
{
    char *address;
    address = argv[1];

    int client_socket;
    client_socket = socket(AF_INET, SOCK_STREAM, 0);

    // connect to an address
    struct sockaddr_in remote_address;
    remote_address.sin_family = AF_INET;
    remote_address.sin_port = htons(80);
    inet_aton(address, &remote_address.sin_addr.s_addr);

    connect(client_socket, (struct sockaddr *) &remote_address, sizeof(remote_address));

    char request[] = "GET / HTTP/1.1\r\n\r\n";
    char response[4096];

    send(client_socket, request, sizeof(request), 0);
    recv(client_socket, &response, sizeof(response), 0);

    printf("response from server: %s\n", response);
    close(client_socket);

    return 0;
}

Ответы [ 2 ]

5 голосов
/ 29 мая 2019

Учебник плохой, правильный код

inet_aton(address, &remote_address.sin_addr);

remote_address.sin_addr относится к типу in_addr, определение которого

struct in_addr {
    unsigned long s_addr;
};

&remote_address.sin_addr.s_addr и &remote_address.sin_addr будет оцениваться по тому же адресу, но первый имеет неправильный тип.Оригинал будет компилироваться с предупреждением в GCC с настройками по умолчанию, но это нарушение ограничения !

Что касается кода Visual Studio, вы должны выглядеть сложнее, иливозможно, скомпилируйте с -Werror!


Время искать лучшие учебники.

3 голосов
/ 29 мая 2019

Проверьте типы.Со страницы руководства

int inet_aton(const char *cp, struct in_addr *inp);

второй аргумент является указателем на переменную типа struct in_addr.

В вашем коде вы определили remote_address как

 struct sockaddr_in remote_address;

, где struct sockaddr_in определено как

struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // ***** this is the target
    char             sin_zero[8];  // zero this if you want to
};

Итак, ваше использование

 inet_aton(address, &remote_address.sin_addr.s_addr);

должно быть

inet_aton(address, &(remote_address.sin_addr)); // explicit parenthesis to clarify type
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...