我如何从UDP套接字(Windows c++)获得IP信息
How can I get IP information from a UDP socket (Windows C++)?
我试图找到我的UDP套接字绑定的IP地址(假设我不想使用另一种方法来找到计算机的IP地址)。如何做到这一点?下面的代码适用于端口号,但对于地址总是返回0.0.0.0:
struct sockaddr_in sin;
int addrlen = sizeof(sin);
if(getsockname(clientSock, (struct sockaddr *)&sin, &addrlen) == 0 &&
sin.sin_family == AF_INET &&
addrlen == sizeof(sin)){
printf("RETURNING ADDR: %s: len = %dn", inet_ntoa(sin.sin_addr),
strlen(inet_ntoa(sin.sin_addr)));
}
使用以下代码绑定套接字:
sockaddr_in local;
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;//inet_addr("127.0.0.1");
local.sin_port = 0; //assign given port
result = bind(clientSock, (sockaddr*)&local, sizeof(local));
谢谢你所有的帮助。感谢您的宝贵时间!
0.0.0.0
是INADDR_ANY
,这意味着套接字绑定到主机上的所有本地地址,而不仅仅是一个地址。您正在请求一个地址,但您没有绑定到一个地址,因此getsockname()
无法报告特定的地址。
如果您希望getsockname()
报告一个特定的地址,您必须将bind()
发送到该特定的地址。因此,使用GetAdaptersAddresses
枚举本地主机上的所有接口,并使用bind()
为每个地址提供单独的套接字,而不是将INADDR_ANY
绑定到单个套接字上。
否则,您可以将单个套接字bind()
设置为INADDR_ANY
,然后使用WSARecvMsg()
(而不是recv()
, recvfrom()
或WSARecvFrom()
)读取传入的数据包。如果您在setsockopt()
中启用适当的选项,WSARecvMsg()
可以报告有关每个数据包的到达接口和目的地址的详细信息。
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- 如何从C++中的依赖类型中获得它所依赖的类型
- 欧拉项目#8答案是大以获得有效答案
- 如何使用C/C++在MacOSX中获得键盘布局
- 如何在不产生任何垃圾的情况下获得C中的像素
- 有没有一种方法可以在编译时获得作用域类名
- 如何在C++中获得"静态纯虚拟"功能?
- 如何设置一个范围来提取我想要获得的信息
- 在多次运行中获得一致的callgrind输出
- 通过错误处理,在C++中可靠地获得用户十六进制输入
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 在我的代码中,获得最大的Pair Wise产品C++和输出并不总是正确的
- 当用户在qtablewidget中输入单元格时,如何获得信号?C++
- 未获得字符串中的预期输出
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- Qt:当QListView获得新条目时,如何更新QStringList
- 如何在卷曲中获得卷曲/卷曲.h?
- 如何在创建自定义迭代器时获得 std::p air 的第一个和第二个?
- 当我输入字符类型的数字时,为什么我无法获得整数?
- 提升,以分钟精度获得 UTC 时间