簡體   English   中英

錯誤的輸出 inet_ntop

[英]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);
}

這里有兩個問題:

  1. 第三參數inet_ntop()應該是一個char -array或一個指向第1個元件char -array。

  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM