SSDP和接口IP地址

我正在编写需要发送和接收SSDP消息的UPnP AV / DLNA DMS。为了响应一些
M-SEARCH
数据包,我需要发送一个带有资源URL(在这种情况下是HTTP服务器)的回复,我选择将其绑定到
INADDR_ANY
0.0.0.0
)。当然,这个地址对于
M-SEARCH
包的发送者没有意义:收到
M-SEARCH
的接口的地址是最合适的。 如何确定在回复数据包中发送的适当地址? 我考虑过的一些想法是: 将不同的接收器绑定到每个插槽。当接收者获得一个
M-SEARCH
包时,回复地址可以在回复中使用套接字的本地地址。然而,这需要知道并迭代所有接口,并在接口可用性改变时添加和移除接收器。 将单个接收器放在
INADDR_ANY
上,并迭代接口网络掩码以确定可能的源。但是,多个接口可能共享同一个子网。 收到数据包后,提取数据包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地址。     

要回复问题请先登录注册