如何在 Objective-C 中监听网络端口
Posted
技术标签:
【中文标题】如何在 Objective-C 中监听网络端口【英文标题】:How to listen on a network port in Objective-C 【发布时间】:2011-04-07 12:40:55 【问题描述】:我正在尝试为 iPhone 制作一个可以监听特定网络端口上的流量的应用程序。
我网络上的服务器正在特定端口上发送消息(服务器处理的设备的不同状态消息)。
我的问题是,当我创建一个线程并 makePairWithSocket 时,我会阻止其他想要向服务器发送消息的人的端口,所以我只想监听指定端口上的流量,然后检查特定的heraders,然后使用这些消息。 我知道如何建立连接并使用写入和读取流与服务器通信,但随后我 makePairWithSocket 并阻止了网络上所有其他设备的端口
任何人对如何在不与服务器配对的情况下在 Objective-C 中侦听端口有任何建议?
提前致谢 丹尼尔
【问题讨论】:
【参考方案1】:查看 CocoaAsyncSocket。它为您提供了一种很好的结构化方式(使用委托)来发送和接收数据......也可以使用多个客户端。文档非常好。 project link
编辑:查看无状态 UDP 连接的 AsyncUdpSocket 类。
【讨论】:
我以前看过那个项目站点,但是如果不连接到服务器并阻塞端口,我真的找不到任何可以做到这一点的东西。您对如何使用 AsyncSocket 解决这个问题有任何想法吗? 找到了这个:-acceptOnAddress:port:error: 我要创建什么来使用它?如果我有一个线程,它是如何工作的? -acceptOnAddress:port:error: 我想这就是我所追求的,在特定端口上接受来自特定主机的连接,但我将如何实现它以便我可以在后台收听它? 一个服务器可以在一个端口上接受多个连接。服务器的 AsyncSocketDelegate 有接收方法“- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;”其中“sock”参数属于发送数据的客户端。您可以存储“sock”参数并使用 [sock writeData:] 将数据发送到此特定客户端。所以端口没有被阻塞。您无需断开任何连接。查看 CococaAsyncSocket 提供的示例。 在哪里可以找到示例? AsyncSocket *as = [[AsyncSocket alloc] initWithDelegate:self]; NSError *e; if([as acceptOnInterface:IP port:PORT error:&e]) NSLog(@"Success"); else NSLog(@"失败:%@", e);一般CFsocket错误是我使用上述代码时得到的,这不应该吗?我建立了连接并设置了一个套接字来监听,还没有设置延迟,因为我想让连接正常工作。【参考方案2】:我认为这需要远低于套接字 API 级别的网络支持,可能在硬件驱动程序级别,假设数据包甚至被路由到您的设备。
【讨论】:
我想他是想抓一个UDP广播包,可以在socket API级别完成。 服务器将向发送问题的 IP 发送响应,因此我想配对并发送问题,然后关闭连接并等待发送给我的答案。但是如果我保持配对,服务器将不会发送答案,因为我阻塞了端口,它会认为我要发送更多数据。你能在没有连接的情况下接听“电话”吗? 我可以在服务器中对 iPhone 的 IP 进行硬编码,以便在状态发生变化时发送到该 IP。但是如何在不配对和阻塞端口的情况下接受连接?以上是关于如何在 Objective-C 中监听网络端口的主要内容,如果未能解决你的问题,请参考以下文章