Linux SSDP和接口IP地址
我正在写一个/需要发送和接收消息。为了响应一些Linux SSDP和接口IP地址,linux,upnp,dlna,network-interface,ssdp,Linux,Upnp,Dlna,Network Interface,Ssdp,我正在写一个/需要发送和接收消息。为了响应一些M-SEARCH数据包,我需要发送一个带有资源URL的回复(在本例中是HTTP服务器),我选择将其绑定到INADDR\u ANY(0.0.0)。当然,这个地址对于M-SEARCH数据包的发送者来说毫无意义:接收M-SEARCH的接口的地址是最合适的 如何确定要在回复数据包中发送的适当地址? 我考虑过的一些想法是: 将不同的接收器绑定到每个套接字。当接收者收到M-SEARCH数据包时,应答地址可以在应答中使用套接字的本地地址。然而,这需要了解并迭代所有
M-SEARCH
数据包,我需要发送一个带有资源URL的回复(在本例中是HTTP服务器),我选择将其绑定到INADDR\u ANY
(0.0.0
)。当然,这个地址对于M-SEARCH
数据包的发送者来说毫无意义:接收M-SEARCH
的接口的地址是最合适的
如何确定要在回复数据包中发送的适当地址?
我考虑过的一些想法是:
M-SEARCH
数据包时,应答地址可以在应答中使用套接字的本地地址。然而,这需要了解并迭代所有接口,并随着接口可用性的变化添加和删除接收器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);
检查
me
中的IP地址。因为这些是通用接口,所以它适用于IPv4或IPv6地址。SSDP通过UDP。。。马特·乔纳:啊,我在维基百科的页面上看到了很多关于“HTTP”的内容,并假设它是TCP。您可以连接UDP套接字,然后在连接的套接字上使用getsockname(2)
。我对未连接的套接字不太确定,但连接套接字并不可怕。这似乎有效。我应该重新表述这个问题,把重点放在UDP上。