簡體   English   中英

SSDP和接口IP地址

[英]SSDP and interface IP address

我正在編寫需要發送和接收SSDP消息的UPnP AV / DLNA DMS 為了響應一些M-SEARCH數據包,我需要發送一個帶有資源URL(在這種情況下是HTTP服務器)的回復,我選擇將其綁定到INADDR_ANY0.0.0.0 )。 當然這個地址是無意義的的發送者M-SEARCH分組:在其上的接口的地址M-SEARCH接收是最合適的。

如何確定在回復數據包中發送的適當地址?

我考慮過的一些想法是:

  1. 將不同的接收器綁定到每個插槽。 當接收者獲得M-SEARCH包時,回復地址可以在回復中使用套接字的本地地址。 然而,這需要知道並迭代所有接口,並在接口可用性改變時添加和移除接收器。
  2. INADDR_ANY上放置一個接收器,並迭代接口網絡掩碼以確定可能的源。 但是,多個接口可能共享同一個子網。
  3. 收到數據包后,提取數據包IP目標地址。 這將是IP特定的,並且可能在網絡抽象中的某處丟失。

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.

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