我已编写此代码来设置服务器的流:
-(void)streamOpenWithIp:(NSString *)ip withPortNumber:(int)portNumber;
{
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (__bridge CFStringRef)ip, portNumber, &readStream, &writeStream);
if(readStream && writeStream)
{
CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
//Setup inpustream
inputStream = (__bridge NSInputStream *)readStream;
[inputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
//Setup outputstream
outputStream = (__bridge NSOutputStream *)writeStream;
[outputStream setDelegate:self];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream open];
}
}
Run Code Online (Sandbox Code Playgroud)
我能够连接到服务器并发送和接收数据.但我想检查连接是否仍然存在.如果我从wifi路由器断开电缆,我仍然可以在流中发送数据,并且没有发生错误.
您可以在应用程序级别通过使用计时器发送一些消息并检查是否收到回复来解决此问题.但是你也可以用较低级别的TCP Keep-Alive技术来解决这个问题.
如何使用NSStream实现此功能?如何设置检查间隔?
我假设你通过TCP Keep-Alive检查流来关闭流时会得到一个NSStreamEventErrorOcurred?
我已经查过这篇文章了,但我无法弄明白: 在iOS中保持套接字连接存活
谢谢你的帮助!
Apple设备===路由器=== WiFi模块
Apple设备(iPhone)通过TCP连接连接到WiFi模块端口2000.我想在Apple设备上激活TCP keepalive数据包发送,以找出与WiFi模块的TCP连接何时丢失(模块已关闭).
我的流设置
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)CFBridgingRetain(moduleIPaddress), port2000, &readStream, &writeStream);
outputStream = (NSOutputStream *)CFBridgingRelease(writeStream);
inputStream = (NSInputStream *)CFBridgingRelease(readStream);
[outputStream setDelegate:(id)self];
[inputStream setDelegate:(id)self];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream open];
[inputStream open];
Run Code Online (Sandbox Code Playgroud)
我试图激活keepalive根据David H发布在iOS中保持套接字连接
- (void) stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {
switch (streamEvent) {
case NSStreamEventOpenCompleted:
if (theStream == outputStream) {
/*
CFDataRef data = (CFDataRef)CFWriteStreamCopyProperty((__bridge CFWriteStreamRef)theStream, kCFStreamPropertySocketNativeHandle);
if(data) {
CFSocketNativeHandle socket_handle = *(CFSocketNativeHandle *)CFDataGetBytePtr(data);
CFRelease(data);
NSLog(@"SOCK HANDLE: %x", socket_handle);
//Enabling keep alive
int …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试连接到tcp服务器.一切都很好,但如果服务器不可用,应用程序冻结约30秒,这不是很好.我已经搜索了一个分辨率,但到目前为止找不到有用的东西.
也许你们中的某个人有一个检查连接的解决方案?
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)@"IP_SERVER_PATH", 6666, &readStream, &writeStream);
inputStream = (__bridge NSInputStream *)readStream;
outputStream = (__bridge NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
Run Code Online (Sandbox Code Playgroud)