簡體   English   中英

字符串中的IP地址檢測(C ++)

[英]IP address detection in string (C++)

我在C ++中有一個有趣的IP地址檢測問題。 我使用了inet_pton函數和sockaddr_in結構。 如果字符串是有效的IPv4或IPv6,則函數將返回AF_INETAF_INET6 否則返回零。

下面的代碼不起作用。 當輸入有效的IPv6地址(IPv4地址和無效地址都可以)時, SIGSEGV處於具有IPv6檢測的條件下。 刪除IPv4條件后,同樣的問題。

#include <string>
#include <iostream>
#include <arpa/inet.h>

using namespace std;

int isIP(string);

int main(int argc, char *argv[]){
        string s = "::1";
        int test = isIP(s);
        return 0;
}

int isIP(string addr){
        struct sockaddr_in sa;
        if((inet_pton(AF_INET, addr.c_str(), &(sa.sin_addr))))
                return AF_INET;
        if((inet_pton(AF_INET6, addr.c_str(), &(sa.sin_addr))))
                return AF_INET6;
        return 0;
}

但是當功能IsIP像下面的代碼一樣更改時, 一切都可以

int isIP(string addr){
        struct sockaddr_in sa;
        cout << addr + "\n";
        if(inet_pton(AF_INET, addr.c_str(), &(sa.sin_addr)))
                return AF_INET;
        if(inet_pton(AF_INET6, addr.c_str(), &(sa.sin_addr)))
                return AF_INET6;
        return 0;
}

要么

int isIP(string addr){
        struct sockaddr_in sa, sa2;
        if((inet_pton(AF_INET, addr.c_str(), &(sa.sin_addr))))
                return AF_INET;
        if((inet_pton(AF_INET6, addr.c_str(), &(sa2.sin_addr))))
                return AF_INET6;
        return 0;
}

要么

int isIP(string addr){
        struct sockaddr_in sa;
        int r1 = inet_pton(AF_INET, addr.c_str(), &(sa.sin_addr));
        int r2 = inet_pton(AF_INET6, addr.c_str(), &(sa.sin_addr));

        if(r1)
                return AF_INET;
        if(r2)
                return AF_INET6;
        return 0;
}

首先實現isIP功能的問題是什么?

如果進行ipv6測試,則必須將指針傳遞給struct in6_addr。

struct sockaddr_in sa;

這是IPv4的結構; 它沒有足夠的空間來容納IPv6地址,因此在這種情況下,您將越界。

恰好在函數中添加了更多代碼,恰好使該函數可以使用更多的內存-通過聲明另一個變量,或者觸發一些我們無法合理化的,實現定義的任意構造,因此,當您溢出sa ,正在溢出到進程所擁有的內存中,因此不會觸發訪問沖突錯誤。 但是,這仍然是非常錯誤的。

IPv6地址將被讀入struct in6_addr 一個包含在struct sockaddr_in6 ,例如:

bool isIPv6(const string& addr)
{
   struct sockaddr_in6 sa;
   if (inet_pton(AF_INET6, addr.c_str(), &(sa.sin_addr)))
       return true;
   return false;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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