[英]SSDP and interface IP address
我正在編寫需要發送和接收SSDP消息的UPnP AV / DLNA DMS 。 為了響應一些M-SEARCH
數據包,我需要發送一個帶有資源URL(在這種情況下是HTTP服務器)的回復,我選擇將其綁定到INADDR_ANY
( 0.0.0.0
)。 當然這個地址是無意義的的發送者M-SEARCH
分組:在其上的接口的地址M-SEARCH
接收是最合適的。
如何確定在回復數據包中發送的適當地址?
我考慮過的一些想法是:
M-SEARCH
包時,回復地址可以在回復中使用套接字的本地地址。 然而,這需要知道並迭代所有接口,並在接口可用性改變時添加和移除接收器。 INADDR_ANY
上放置一個接收器,並迭代接口網絡掩碼以確定可能的源。 但是,多個接口可能共享同一個子網。 getsockname(2)
后跟getnameinfo(3)
報告TCP / IP堆棧分配給套接字的IP地址。 (顯然,如果服務器和客戶端位於NAT系統的兩側,這將與客戶端可以使用的內容不匹配;在這種情況下,可能有聰明的UPnP技巧來發現客戶端可用於聯系服務器的IP地址。)
我假設您的服務器看起來像這樣:
lfd = socket();
ret = bind(lfd,...);
connection = listen(lfd, 10);
/* add connection to your select queue or poll queue */
您可以附加類似於此的代碼:
struct sockaddr_storage me;
socklen_t *len = sizeof(me);
char name[40];
ret = getsockname(connection, &me, &len);
ret = getnameinfo(&me, &len, name, sizeof(name), NULL, 0, NI_NUMERICHOST);
getnameinfo(3)
檢查struct sockaddr_storage
me
的IP地址。 因為這些是通用接口,所以它適用於IPv4或IPv6地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.