c - 警告:从不兼容的指针类型传递“inet_aton”的参数 2........错误
问题描述
我不知道这个错误意味着什么以及如何解决它。
我一直在关注Sock)et Programming Tutorials In C For Beginners | Eduonix在 Youtube 上的第 2 部分,但我无法从这个人那里运行任何东西,代码来自他的教程。
如果有人可以帮助我了解此错误的含义以及如何解决它?
这是错误:
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;
^~~~~~~~~
我在 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;
}
解决方案
教程不好,正确的代码是
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
and将&remote_address.sin_addr
评估相同的地址,但前者的类型错误。原始版本将在 GCC 中使用默认设置编译并发出警告,但这是违反约束的!
至于 Visual Studio 代码,您应该更仔细地查看,或者使用-Werror
!
是时候寻找更好的教程了。
推荐阅读
- python - Python中列表的迭代
- c# - 从不同方法调用时不添加行
- javascript - 在 vscode 扩展中检测全屏模式
- solr - 在 Solr 中的 Multi Select Faceting 中用多个标签标记的单个过滤器
- bash - 一起使用 Bash Less 和 Grep
- three.js - 如何投影(或粘贴)全景图进行建模?
- matlab - 根据给定位置选择矩阵条目
- android - 仅使用 BLE 的设备之间的通信
- php - composer -V 不适用于 CMD windows 10 中的 Composer
- c# - 如何在我的 LINQ 查询中使用添加 IN 条件 - 无法将类型“System.Byte”转换为类型“System.Object”