[英]Wrong output inet_ntop
我正在嘗試從 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);
}
這里有兩個問題:
第三參數inet_ntop()
應該是一個char
-array或一個指向的第1個元件char
-array。
inet_ntop()
的第四個參數應該是目標緩沖區的大小,其地址作為第三個參數傳遞。
您要做的是將未初始化的char
指針dst
作為目標傳遞,並告訴函數它將指向sizeof(char*)
字節內存。
AF_INET
地址(格式為xxx.xxx.xxx.xxx
)最多使用 4x3 個字符加上 3 個定界符.
char
s 總計 15 個char
加上 1 個額外的char
用作0
終止符以使其成為 C-“字符串”,因此更正后的代碼如下所示:
char dst[16] = ""; /* inet_ntop() does not necessarily 0-terminates the result. */
inet_ntop(AF_INET, &sockin->sin_addr, dst, sizeof dst);
正如Filipe Gonçalves在他的評論中指出的那樣,可以使用INET_ADDRSTRLEN
(如果可用)而不是硬編碼的“幻數” 16
來定義 IPv4 地址的文本表示的緩沖區大小。 這是一件好事。
inet_ntop()
文檔在這里:
問題在於您嘗試保存結果的目標字符 * 的大小,以及它未初始化的事實,您想要做的是將它保存在一個字符 [] 中。
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,我已將其上傳到 github。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.