Предупреждение: передача аргумента 2 'inet_aton' из несовместимого типа указателя........ ОШИБКА
Я не знаю, что означает эта ошибка и что нужно сделать, чтобы ее исправить.
Я следил за 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, но ошибка не появляется в редакторе / отладчике Visual Code, только если я компилирую в оболочке.
Вот код:
#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 ответа
Учебник плохой, правильный код
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
!
Время искать лучшие учебники.
Проверьте типы. Со страницы руководства
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