簡體   English   中英

從sockaddr_storage中檢索ip和端口

[英]retrieving ip and port from a sockaddr_storage

我有一個包含ipv4地址和遠程主機端口的sockaddr_storage 我還沒有看到這些struct之前,雖然S和我不知道如何將它轉換成一個struct ,我可以直接檢索IP地址和端口號。 我試過谷歌搜索struct但沒有找到任何東西。 有關如何做到這一點的任何建議?

謝謝

您可以將指針轉換為struct sockaddr_in *struct sockaddr_in6 *並直接訪問成員,但這將打開一堆關於別名違規和錯誤編譯問題的蠕蟲。

更好的方法是使用NI_NUMERICHOSTNI_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.

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