如何在Objective-C中监听网络端口

5
我正在尝试制作一个iPhone应用程序,可以监听特定网络端口上的流量。
我的网络中有一个服务器在特定端口发送消息(处理服务器设备的不同状态消息)。
我的问题是,当我创建一个线程并使用makePairWithSocket时,我会阻塞其他想向服务器发送消息的设备的端口,因此我只想监听指定端口上的流量,然后检查特定的头部,再使用这些消息。我知道如何建立连接并使用写入和读取流与服务器通信,但是这样做会使用makePairWithSocket并阻塞网络中所有其他设备的端口。
有没有人有任何关于如何在Objective-C中监听端口而不与服务器配对的建议?
提前感谢 Daniel
2个回答

4

请查看CocoaAsyncSocket。它以代理的方式提供了一种良好结构化的方法,用于发送和接收数据...还可以处理多个客户端。文档相当不错。项目链接

编辑:请查看AsyncUdpSocket类,用于无状态UDP连接。


我之前看过那个项目的网站,但是我没有找到任何不需要连接服务器和阻塞端口就能实现这一功能的东西。你有没有想过使用AsyncSocket来解决这个问题? - KungWaz
找到了这个:-acceptOnAddress:port:error: 我需要创建什么来使用它?如果我有一个线程,它该如何工作?-acceptOnAddress:port:error: 我猜这就是我想要的,可以接受来自特定主机和端口的连接,但是我应该如何实现它,以便我可以在后台监听它呢? - KungWaz
1
一个服务器可以在单个端口上接受多个连接。服务器的AsyncSocketDelegate具有接收方法“-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;”,其中“sock”参数属于发送数据的客户端。您可以存储“sock”参数并使用[sock writeData:]将数据发送到此特定客户端,因此端口不会被阻塞。您无需断开任何连接。请查看CococaAsyncSocket提供的示例。 - Felix
我在哪里可以找到示例? - KungWaz
AsyncSocket *as = [[AsyncSocket alloc] initWithDelegate:self]; NSError *e;if([as acceptOnInterface:IP port:PORT error:&e]) NSLog(@"成功"); else NSLog(@"失败:%@", e);当我使用上述代码时,我得到了通用的CFsocket错误,这不应该有效吗? 我建立连接并设置套接字进行监听,还没有设置委托,因为我想让连接工作。 - KungWaz

0

我认为这需要在套接字 API 级别以下的网络支持,可能是在硬件驱动程序级别上,假设数据包甚至被路由到您的设备。


我认为他想捕获UDP广播数据包,这可以在套接字API级别上完成。 - dreamlax
服务器将向发送问题的IP地址发送响应,因此我想配对并发送一个问题,然后关闭连接并等待针对我的答案。但是,如果我保持配对,服务器将不会发送答案,因为我正在阻塞端口,并且它会认为我将发送更多数据。 您能否在没有连接的情况下接受“调用”? - KungWaz
我可以在服务器中硬编码iPhone的IP,以便在状态更改时发送到该IP。但是,如何在未配对和阻止端口的情况下接受连接? - KungWaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接