我试图从inet_ntop打印一个ip地址,但输出看起来很奇怪。
该程序似乎运行良好,我成功连接套接字,但它打印出来:
H��H9�u�H�[]A\A]A^A_�ff.�
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <string.h>
#include <arpa/inet.h>
int main(int argc, char *argv[]){
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct addrinfo hints, *result;
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = 0;
hints.ai_flags = 0;
int s = getaddrinfo("irc.root-me.org", "6667", &hints, &result);
if( s != 0){
printf("erreur\n");
exit(EXIT_FAILURE);
}
int f = connect(sock, result->ai_addr, result->ai_addrlen);
if(f != 0){
printf("erreur connect\n");
}
struct sockaddr_in *sockin;
sockin = (struct sockaddr_in *)result->ai_addr;
char *dst;
inet_ntop(AF_INET, &sockin->sin_addr, dst, sizeof(char *));
printf("%s\n", dst);
freeaddrinfo(result);
exit(0);
}
答案 0 :(得分:4)
这里有两个问题:
inet_ntop()
的3 rd 参数应为char
- 数组或指向1 st 元素的指针char
- 阵列
inet_ntop()
的4 th 参数应该是目标缓冲区的 size ,传递为3 rd 参数。
您要做的是将未初始化的char
- 指针dst
作为目标传递,并告诉它将指向sizeof(char*)
字节内存的函数。
AF_INET
地址(格式为xxx.xxx.xxx.xxx
)最多使用4x3个字符加3个分隔.
char
个,总计最多15 char
} s加1 char
作为0
- 终结符使其成为C - &#34;字符串&#34;,所以固定代码看起来像这样:
char dst[16] = ""; /* inet_ntop() does not necessarily 0-terminates the reuslt. */
inet_ntop(AF_INET, &sockin->sin_addr, dst, sizeof dst);
正如Filipe Gonçalves中 his comment 指出的那样,可以使用INET_ADDRSTRLEN
(如果可用)而不是硬编码的#34;幻数&#34 ; 15
定义IPv4地址的文本表示的缓冲区大小。这是一件好事。
inet_ntop()
的文档在这里:
答案 1 :(得分:0)
问题在于您尝试保存结果的目标字符*的大小,以及它未初始化的事实,您要做的是将其保存在char []中。
x86上的sizeof(char *)在x64上是4B和8B,IP地址通常大于(IPv4地址在7到15个字节之间)+ 1对于空终止符。
您可以按如下方式修改代码:
char dst[16] = {0};
inet_ntop(AF_INET, &sockin->sin_addr, dst, sizeof(dst));
修复后:
$ ./main
212.83.153.145
如果你想要完整的固定main.c,我会uploaded it to github.