gpt4 book ai didi

ios - CFSocket 获取其他 CFSocketContext 的回调

转载 作者:行者123 更新时间:2023-11-29 03:12:44 26 4
gpt4 key购买 nike

我正在创建套接字并指定一个读取回调,如下所示:

// SocketUser.m     

...

- (void)run
{
CFSocketContext context = {0, (__bridge void *)(self), NULL, NULL, NULL};
CFSocketRef socket = CFSocketCreateWithNative(NULL, fd, kCFSocketReadCallBack, SocketReadCallback, &context);
}

static void SocketReadCallback(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info)
{
SocketUser* obj = (__bridge SocketUser *) info;

[obj readData];
}

- (void)readData
{
...
}

在我的应用程序中,有多个发送 ICMP 数据包的 SocketUser 实例(代码基于 Apple 的 SimplePing 源代码)。

问题在于 SocketUser 的每个实例都接收到 SocketUser 的每个实例的读取回调。例如,如果我有 5 个实例并且其中一个实例收到响应,则所有 5 个实例都会收到回调通知。可以检查“信息”参数,但我真的不明白为什么我会收到其他套接字上接收到的数据的回调。我想我可以忽略来自除“self”以外的任何上下文的回调,但我对首先获得回调感到有点惊讶。

最佳答案

每个 TCP 或 UDP 数据包都包含一个端口号,内核使用它来识别哪个套接字应该接收数据包的有效负载。

ICMP 回显响应数据包不包含端口号。内核无法决定哪个套接字应该接收数据包,所以它只是将数据包发送到所有打开的 ICMP 套接字。因此,您的每个 CFSocket 实例都会收到数据包,并且每个实例都会调用 SocketReadCallback。没有办法避免这种情况。您的对象需要处理接收意外的 ICMP 数据包。

关于ios - CFSocket 获取其他 CFSocketContext 的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22050537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com