objective-c - 如何识别 iOS 设备上收到的 udp 数据包的发件人 IP 地址?

标签 objective-c udp ip-address ios sender

如何找出在运行 iOS 3.2 的设备上接收到的 udp 数据包的发件人 IP 地址或更高?

例如,如果在计算机上使用 Python,我会使用 SocketServer.UDPServer它采用 SocketServer.BaseRequestHandler 的子类它定义了 handle打回来。当数据包到达时,将调用回调,并且发送者的 IP 地址将在 self.client_address 中。 , 其中 selfSocketServer.BaseRequestHandler实例。

不幸的是,在使用 Objective C 编程并使用为 iOS 提供的框架时,我不知道如何提取此信息或访问相关的 ip header 。

现在我唯一的解决方案是在 udp 数据包的主体上明确写入发件人的 ip,但如果我不需要,我宁愿不依赖发件人将这些信息放在那里。

最佳答案

您没有提到您使用什么 API 来接收数据包。不要将 IP 地址写入数据包本身,因为数据包在到达您之前可能会经过多次网络地址转换。

您可以使用常规 BSD 套接字来完成此任务。还有一些围绕 BSD 套接字的 Foundation 类,但我没有亲自使用它们,所以我不能给你一个像样的例子。

// for IPv4 (IPv6 is a little different)

ssize_t received;
char buffer[0x10000];
struct sockaddr_in listenAddr;
struct sockaddr_in fromAddr;
socklen_t fromAddrLen = sizeof fromAddr;

listenAddr.sin_family = AF_INET;
listenAddr.sin_port = htons(12345); // change to whatever port
listenAddr.sin_addr.s_addr = htonl(INADDR_ANY);

int s = socket(AF_INET, SOCK_DGRAM, 0); // create UDP socket
if (s == -1)
    exit(1); // failed to create socket

if (bind(s, (struct sockaddr *) &listenAddr, sizeof listenAddr))
    exit(2); // failed to bind to port 12345 for any address

received = recvfrom(s, buffer, sizeof buffer, 0, (struct sockaddr *)&fromAddr, &fromAddrLen);
if (received == -1)
    exit(3); // some failure trying to receive data

// check the contents of buffer, the address of the source will be in
// fromAddr.sin_addr.s_addr but only if (fromAddrLen == sizeof fromAddr)
// after the call to recvfrom.

char display[16] = {0};
inet_ntop(AF_INET, &fromAddr.sin_addr.s_addr, display, sizeof display);

NSLog (@"The source is %s.", display);
// could show "The source is 201.19.91.102."

关于objective-c - 如何识别 iOS 设备上收到的 udp 数据包的发件人 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3571038/

相关文章:

ios - Singleton 无法与 XCTests 一起使用 - iOS

objective-c - Mac - 获取电池/充电状态(插入或未插入)

ios - 核心情节: Issue with plotSpace:willChangePlotRangeTo and autoscaling of y-axis

kubernetes - cloudflared 出现 "failed to sufficiently increase receive buffer size"错误

tsql - T-Sql : check if IP matches netmask

objective-c - 开发像 Facebook 新 iOS 应用程序中的侧滑菜单的最佳方法是什么?

java - 在Java中: UDP based Client/Server not giving the expected output

LuaSocket (UDP) 不接收数据报

mysql - 检查IP是否在MYSQL中的某个范围内

c# - 列出 IP 子网中的所有地址