首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSDP和接口IP地址

SSDP和接口IP地址
EN

Stack Overflow用户
提问于 2011-03-04 12:08:23
回答 1查看 3.1K关注 0票数 3

我正在编写一个UPnP AV/DLNA DMS,它需要发送和接收SSDP消息。为了响应某些M-SEARCH数据包,我需要用资源的URL (在本例中是HTTP )发送答复,我选择绑定到INADDR_ANY (0.0.0.0)。当然,这个地址对M-SEARCH数据包的发送方来说是毫无意义的:接收M-SEARCH的接口的地址是最合适的。

如何确定在回复包中发送的适当地址?

我考虑过的一些想法是:

  1. 将不同的接收器绑定到每个套接字上。当接收方接收到M-SEARCH数据包时,回复地址可以在回复中使用套接字的本地地址。但是,这需要了解并迭代所有接口,并随着接口可用性的变化而添加和移除接收者。
  2. INADDR_ANY上放置一个接收器,并迭代接口网络掩码以确定可能的源。然而,多个接口可能共享同一个子网。
  3. 接收到数据包时提取IP目标地址。这将是特定于IP的,并且可能在网络抽象的某个地方丢失。
EN

回答 1

Stack Overflow用户

发布于 2011-03-04 12:45:55

getsockname(2)后面跟着getnameinfo(3)报告您的TCP/IP堆栈分配给套接字的IP地址。(显然,如果服务器和客户端位于NAT系统的对立面,这将不符合客户端可以使用的内容;在这种情况下,可能有聪明的UPnP欺骗来发现客户端可以用来联系服务器的IP地址。)

我假设您的服务器如下所示:

代码语言:javascript
复制
lfd = socket();
ret = bind(lfd,...);
connection = listen(lfd, 10);
/* add connection to your select queue or poll queue */

您可以附加类似以下代码:

代码语言:javascript
复制
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地址。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5193503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档