如何在iOS中为套接字连接设置“KEEP ALIVE”?

时间:2013-05-14 05:48:38

标签: iphone ios objective-c xcode sockets

我们使用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];

}

但只要应用程序进入后台,套接字就会断开连接。所以,我们必须创建套接字"KEEP ALIVE"

在服务器端,我们已经通过socket.setKeepAlive(true, 2000);实现了这一点,但我们无法在应用程序(即iOS)端设置此功能。

我们搜索了这些链接 - Link1Link2

他们已指定使用如下代码来使socket保持活动状态;

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)中使套接字连接保持活动状态?

感谢。

1 个答案:

答案 0 :(得分:0)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
你的.m文件