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

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

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

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

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

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

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

 // 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."