“NSStreamNetworkServiceTypeBackground”在技术上是做什么的?

3

我有一个内部应用程序(不适用于iPhone商店分发,因此不受苹果批准),需要在运行时保持少量TCP和UDP套接字绑定。

在测试过程中,我注意到我的绑定套接字存在一些奇怪的行为-每当设备进入睡眠状态时,它就会关闭。例如,当您按下手机顶部的电源按钮时,这种情况就会发生,而我真的不希望它发生。更不用说这似乎是对BSD套接字API合同的严重违反。

套接字代码全部使用C编写,因此未使用Objective-C nsstream库。

我注意到有各种方法可以保持套接字开放,例如VOIP、音乐流等。 nsstream文档本身列出了一个NSStreamNetworkServiceTypeBackground属性,似乎可以帮助我的应用程序在手机进入睡眠状态时保持套接字开放。苹果文档底部列出了以下属性:

常量

NSStreamNetworkServiceTypeVoIP
指定流提供VoIP服务。

NSStreamNetworkServiceTypeVideo
指定流提供视频服务。

NSStreamNetworkServiceTypeBackground
指定流提供后台服务。

NSStreamNetworkServiceTypeVoice
指定流提供语音服务。

但由于我的应用程序网络代码没有使用Objective-C API,我需要知道:上述常量是如何实现的?也许有一个未记录的套接字选项可以用来实现相同的结果?基本上,我只需要告诉内核在设备休眠时不要干扰我的套接字。

编辑:作为对内核调用进行反向工程的替代方法,也许有一种方法可以将我的套接字文件描述符传递给Objective-C代码,在那里可以应用这些选项?


请注意,NAT设备可能会随时终止“非活动”TCP会话,并且远程对等方可能会发送TCP keepalive ping以及协议内的keepalive ping。 - sarnold
@sarnold 谢谢,我明白了。这是一个绑定的套接字,我不希望传入的通信跨越 NAT 边界。 - ff002a
我模糊地记得你可以在C sockets和NSStream对象之间进行免费桥接。不过我需要查一下。 - 11684
哎呀,我刚看到这个帖子已经超过一年了。至少我的回答可以帮助社区。 - 11684
2个回答

0

clientSocket是一个已连接的套接字,如果要使用对象c,则必须先连接。

@property (nonatomic, strong) NSInputStream *inputStream ;
@property (nonatomic, strong) NSOutputStream *outputStream ;

CFReadStreamRef readStreamRef = nil ;
CFWriteStreamRef writeStreamRef = nil ;
CFStreamCreatePairWithSocket(NULL, clientSocket, &readStreamRef, &writeStreamRef) ; // the socket must have already been connected.
_inputStream = (__bridge_transfer NSInputStream *)readStreamRef ;
_outputStream = (__bridge_transfer NSOutputStream *)writeStreamRef ;
[_inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;
[_outputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;
[_inputStream open] ;
[_outputStream open] 

0

如果您正在使用CFStream进行网络编程,您可以这样做:

NSInputStream *inputStream = (__bridge_transfer NSInputStream *)readStream;
NSOutputStream *outputStream = (__bridge_transfer NSOutputStream *)writeStream;

之后,您可以使用已经找到的常量与ObjC NSInputStreamNSOutputStream一起使用。(NSInputStreamNSOutputStream都扩展了NSStream。)


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