Objective c 如何识别发送者';iOS设备上接收的udp数据包的ip地址?

Objective c 如何识别发送者';iOS设备上接收的udp数据包的ip地址?,objective-c,udp,ip-address,ios,sender,Objective C,Udp,Ip Address,Ios,Sender,如何查找在运行iOS 3.2或更高版本的设备上接收的udp数据包的发送方ip地址 例如,如果在计算机上使用Python,我会使用SocketServer.UDPServer,它接受SocketServer.BaseRequestHandler的子类,该子类定义句柄回调。当数据包到达时,将调用回调,发送方的ip地址将位于self.client_address,其中self是SocketServer.BaseRequestHandler实例 不幸的是,在使用Objective C编程和使用iOS提供

如何查找在运行iOS 3.2或更高版本的设备上接收的udp数据包的发送方ip地址

例如,如果在计算机上使用Python,我会使用
SocketServer.UDPServer
,它接受
SocketServer.BaseRequestHandler
的子类,该子类定义
句柄
回调。当数据包到达时,将调用回调,发送方的ip地址将位于
self.client_address
,其中
self
SocketServer.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."

注意recvfrom的fromAddr参数-这是有趣的部分。它由发送者的地址/端口填充。