[英]Extracting IP and port from multiple sockaddr_storage's into a char*
[英]retrieving ip and port from a sockaddr_storage
我有一個包含ipv4地址和遠程主機端口的sockaddr_storage
。 我還沒有看到這些struct
之前,雖然S和我不知道如何將它轉換成一個struct
,我可以直接檢索IP地址和端口號。 我試過谷歌搜索struct
但沒有找到任何東西。 有關如何做到這一點的任何建議?
謝謝
您可以將指針轉換為struct sockaddr_in *
或struct sockaddr_in6 *
並直接訪問成員,但這將打開一堆關於別名違規和錯誤編譯問題的蠕蟲。
更好的方法是使用NI_NUMERICHOST
和NI_NUMERICSERV
標志將指針傳遞給getnameinfo
,以獲取地址和端口的字符串表示形式。 這樣做的優點是它既支持IPv4又支持IPv6,無需額外代碼,理論上也支持所有未來的地址類型。 您可能必須將指針轉換為void *
(或顯式struct sockaddr *
,如果您使用的是C ++)將其傳遞給getnameinfo
,但這不應該導致問題。
要擴展上面的答案並提供使用getnameinfo
函數的代碼,請檢查以下代碼段:
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);
結果是hoststr
包含來自struct sockaddr_storage
的IP地址, portstr
包含一個端口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.