0
我们使用java聊天服务器为iPhone制作了聊天应用程序。如何在iOS中为套接字连接设置“KEEP ALIVE”?
我们为此使用了套接字。在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];
}
但是,只要应用程序在后台运行,套接字就会断开连接。所以,我们必须制造插座"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)中保持活跃?
谢谢。您.m文件
[这](http://stackoverflow.com/questions/11387560/keeping-a-socket-connection-alive-in-ios)后可能会帮助你,让我了解洞察力。祝你好运 – 2013-05-14 05:52:30
@DipenPanchasara:这就是问题中提到的“Link1”:-) – 2013-05-14 05:54:24
这是否有帮助:http://stackoverflow.com/a/15787080/1187415? - 别忘了'#include'。 –
2013-05-14 05:56:21