我正在编写一个UPnP AV/DLNA DMS,它需要发送和接收SSDP消息。为了响应某些M-SEARCH数据包,我需要用资源的URL (在本例中是HTTP )发送答复,我选择绑定到INADDR_ANY (0.0.0.0)。当然,这个地址对M-SEARCH数据包的发送方来说是毫无意义的:接收M-SEARCH的接口的地址是最合适的。
如何确定在回复包中发送的适当地址?
我考虑过的一些想法是:
M-SEARCH数据包时,回复地址可以在回复中使用套接字的本地地址。但是,这需要了解并迭代所有接口,并随着接口可用性的变化而添加和移除接收者。INADDR_ANY上放置一个接收器,并迭代接口网络掩码以确定可能的源。然而,多个接口可能共享同一个子网。发布于 2011-03-04 12:45:55
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地址。
https://stackoverflow.com/questions/5193503
复制相似问题