我正在尝试从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);
}发布于 2015-07-04 15:46:02
问题
问题在于目标char*的大小,您试图将结果保存在其中,并且它未初始化,您想要做的是将其保存在char[]中。
x86上的sizeof(char*)是4B,在x64上是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源代码
如果你想要完整的固定主机,我有上传到github。
https://stackoverflow.com/questions/31222273
复制相似问题