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 に答える