【问题标题】:How to identify sender's ip address of a udp packet received on iOS device?如何识别 iOS 设备上收到的 udp 数据包的发件人 IP 地址?
【发布时间】:2011-04-04 00:25:02
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: objective-c udp ip-address ios sender


    【解决方案1】:

    您没有提及您使用什么 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."
    

    【讨论】:

    • 注意 recvfrom 的 fromAddr 参数 - 这是有趣的部分。它填充了发件人的地址/端口。
    猜你喜欢
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2020-09-02
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多