簡體   English   中英

從sockaddr_storage中提取IP地址和端口信息

[英]Extracting IP Address and Port Info from sockaddr_storage

我目前正在開發一個接收客戶端請求的UDP服務器。 我收到的數據報是一個5個元素長的字節(char)數組,最后兩個元素是一個端口號。

最終,該服務器必須在其自己的數據報中返回IP地址和端口號。

我已經知道如何使用inet_ntop和我連接和接收的sockaddr結構來打印出ip,但它返回的字符串不是我想要的格式。 例如:

string1 = inet_ntop(their_addr.ss_family,get_in_addr(
    (struct sockaddr *)&their_addr),s, sizeof s);

收益:

127.0.0.1

要么:

[1][2][7][.][0][.][0][.][1]

當我需要這樣的東西:

[127][0][0][1]

我應該使用某種字符和數組操作來制作我的4元素字節數組嗎? 或者sockaddr是否有這樣的信息,我可以把它留在這個十六進制形式並返回它?

假設是IPv4。

獲取sockaddr_storagesockaddr結構的地址並將其轉換為IPv4版本sockaddr_in ,您可以訪問IPv4地址的各個字節。

struct sockaddr_in *sin = (struct sockaddr_in *)&their_addr;

然后你可以獲取s_addr成員的地址,該成員是一個32位值( in_addr_t ),它保存ip地址的4個字節(按網絡字節順序)並將其轉換為指向unsigned char的指針,然后允許您訪問個人值的字節。

unsigned char *ip = (unsigned char *)&sin->sin_addr.s_addr;

printf("%d %d %d %d\n", ip[0], ip[1], ip[2], ip[3]);

你想要使用getnameinfo()函數:

int getnameinfo(const struct sockaddr *sa, socklen_t salen,
                   char *host, size_t hostlen,
                   char *serv, size_t servlen, int flags);

例如:

struct sockaddr_storage client_addr;
socklen_t client_len = sizeof(struct sockaddr_storage);

/* Accept client request */
int client_socket = accept(server_socket, 
    (struct sockaddr *)&client_addr, &client_len);

char hoststr[NI_MAXHOST];
char portstr[NI_MAXSERV];

int rc = getnameinfo((struct sockaddr *)&client_addr, 
    client_len, hoststr, sizeof(hoststr), portstr, sizeof(portstr), 
    NI_NUMERICHOST | NI_NUMERICSERV);

if (rc == 0) 
    printf("New connection from %s %s", hoststr, portstr);

這是一個簡單的不可變類,我用於您在問題中提到的相同目的:

class address_t {

private:
    uint16_t m_Port = 0;
    std::string m_Ip = "";

public:
    address_t(const sockaddr_in & address) {
        m_Ip = inet_ntoa(address.sin_addr);
        m_Port = ntohs(address.sin_port);
    }

    uint16_t GetPort() const { return m_Port; }
    std::string GetIp() const { return m_Ip; }
    std::string ToString() const {
        return "IP: " + m_Ip + ", Port: " + std::to_string(m_Port);
    }
};

暫無
暫無

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

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