警告:从不兼容的指针类型传递'inet_aton'的参数2。

som*_*ing 1 c error-handling pointers compiler-errors inet-aton

我不知道此错误的含义以及如何解决该错误。

我一直在关注C入门Sock)et编程教程| Eduonix的第2部分,在Youtube上,但是我一直无法从这个家伙那里运行任何东西,代码来自他的教程。

如果有人可以帮助我了解此错误的含义以及如何解决该错误?

这是错误:

inet_aton(address, &remote_address.sin_addr.s_addr);
                   ^
Run Code Online (Sandbox Code Playgroud)
[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;
            ^~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

我在Visual Studio Code中使用Debian Linux 9.9拉伸和编码,但是仅当我在Shell中进行编译时,该错误才不会在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;
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*ala 5

教程不好,正确的代码是

inet_aton(address, &remote_address.sin_addr);
Run Code Online (Sandbox Code Playgroud)

remote_address.sin_addr是类型in_addr,其定义是

struct in_addr {
    unsigned long s_addr;
};
Run Code Online (Sandbox Code Playgroud)

&remote_address.sin_addr.s_addr&remote_address.sin_addr将计算为同一地址,但前者是错误的类型。原始文件将在GCC中使用默认设置进行警告编译,但这违反约束

至于Visual Studio代码,您应该看起来更难一些,或者用-Werror!进行编译。


是时候寻找更好的教程了。