0

我们使用 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)端进行设置。

我们已经搜索了这些链接 - Link1Link2

他们已指定使用如下代码使套接字保持活动状态;

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) 中保持活动状态?

谢谢。

4

1 回答 1

0
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

在你的 .m 文件上

于 2015-03-18T07:01:16.530 回答