我们使用 java 聊天服务器为 iphone 制作了聊天应用程序。
我们为此使用了套接字。在 iOS 端,我们使用了以下代码;
#import <CFNetwork/CFNetwork.h>
#import <sys/socket.h>
#import <sys/types.h>
- (void) viewDidLoad
{
[self initNetworkCommunication];
}
#pragma mark Network connection
- (void) initNetworkCommunication
{
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"xx.xx.xx.xx", xxxx, &readStream, &writeStream);
inputStream = (NSInputStream *)readStream;
outputStream = (NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
}
但是每当应用程序进入后台时,套接字就会断开连接。所以,我们必须制作 socket "KEEP ALIVE"
。
在服务器端,我们通过 实现了这一点socket.setKeepAlive(true, 2000);
,但我们无法在应用程序(即 iOS)端进行设置。
他们已指定使用如下代码使套接字保持活动状态;
CFDataRef data = (CFDataRef)CFWriteStreamCopyProperty(( CFWriteStreamRef)outputStream, kCFStreamPropertySocketNativeHandle);
if(data)
{
CFSocketNativeHandle socket_handle = *(CFSocketNativeHandle *)CFDataGetBytePtr(data);
CFRelease(data);
NSLog(@"SOCK HANDLE: %x", socket_handle);
//Enabling keep alive
if( setsockopt( socket_handle, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof( opt ) ) < 0 )
{
NSLog(@"Yikes 2: failed to set keepalive! ERRNO: %s", strerror(errno));
}
}
我们已经尝试过这段代码,但无法找到socket_handle, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof( opt )
变量的值。
那么如何使套接字连接在 ios (objective-c) 中保持活动状态?
谢谢。