3

我正在编写一个需要发送和接收SSDP消息的UPnP AV / DLNA DMS 。为了响应某些数据包,我需要发送带有资源(在本例中为 HTTP 服务器)的 URL 的回复,我已选择绑定到( )。当然,这个地址对数据包的发送者来说是没有意义的:接收数据包的接口地址是最合适的。M-SEARCHINADDR_ANY0.0.0.0M-SEARCHM-SEARCH

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

我考虑过的一些想法是:

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

1 回答 1

2

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)检查您的 IP 地址。因为这些是通用接口,所以它适用于 IPv4 或 IPv6 地址。struct sockaddr_storage me

于 2011-03-04T12:45:55.373 回答