打印inet_ntoa(...)报format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int‘警告

        写一个简单的Linux C TCP socket服务端程序,当监听到客户端的连接请求时接受连接,并打印出客户端的IP和端口信息:

...
printf("Client [%s-%d] connected.\n", inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port));
...

编译的时候报出下图的警告(warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]):

明明inet_ntoa函数的返回值是char *类型啊,见鬼了。原因找来找去,最后发现是出现在头文件上面,加上#include <arpa/inet.h> 就正常了。

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <unistd.h>  
#include <arpa/inet.h>  
#include <sys/types.h>   
#include <sys/socket.h>  
#include <netinet/in.h>
#include <errno.h>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个警告提示说,在你的代码中使用了一个未声明的函数 `inet_ntoa()`,所以编译器无法确定该函数的返回类型和参数类型,因此会给出这个警告。同时,还有一个格式化字符串错误,因为 `%s` 格式符需要一个字符串作为参数,但是你传递给它的是一个整数,所以编译器会给出第二个警告。 你需要包含一个头文件 `<arpa/inet.h>` 来声明 `inet_ntoa()` 函数,这个头文件包含了一些网络编程相关的函数和定义。同时,你需要使用 `%d` 格式符来打印一个整数,而不是 `%s` 格式符。 修复代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> int main(int argc, char *argv[]) { // 创建 socket int server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd == -1) { perror("创建 socket 失败"); exit(EXIT_FAILURE); } // 准备地址和端口 struct sockaddr_in server_addr = {0}; server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(8888); // 绑定地址和端口 if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { perror("绑定地址和端口失败"); exit(EXIT_FAILURE); } // 监听端口 if (listen(server_fd, 5) == -1) { perror("监听端口失败"); exit(EXIT_FAILURE); } // 接受客户端连接 struct sockaddr_in client_addr = {0}; socklen_t client_addr_len = sizeof(client_addr); int client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len); if (client_fd == -1) { perror("接受客户端连接失败"); exit(EXIT_FAILURE); } // 打印客户端地址和端口 char client_ip[20]; inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, sizeof(client_ip)); printf("客户端 %s:%d 已连接\n", client_ip, ntohs(client_addr.sin_port)); // 关闭连接 close(client_fd); close(server_fd); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值