【问题标题】:How to set "KEEP ALIVE" for socket connection in iOS?如何在 iOS 中为套接字连接设置“KEEP ALIVE”?
【发布时间】:2013-05-08 07:25:26
【问题描述】:

我们已经使用 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, &amp;opt, sizeof( opt ) 变量的值。

那么如何在 ios (objective-c) 中让 socket 连接保持活跃?

谢谢。

【问题讨论】:

  • this 帖子可能会对您有所帮助,让我知道您的见解。祝你好运
  • @DipenPanchasara:即问题中提到的“Link1”:-)
  • 您的问题到底是什么?代码是否无法编译、是否出现错误或无法按预期工作。 - 请注意,SO_KEEPALIVE 只是一种检查连接的远程端点是否仍然可访问且处于活动状态的方法。设置 SO_KEEPALIVE 不会阻止 iOS 应用程序进入后台! - 另见developer.apple.com/library/ios/#technotes/tn2277/_index.html“当应用程序暂停时,应用程序进程中没有代码执行。这使得应用程序无法处理传入的网络数据。”
  • @Rohan:如果我正确理解“技术说明 TN2277”(我之前评论中的链接),这是不可能的。如有必要,您可能必须重新连接。 - 唯一的另一种可能性是在 Info.plist 中设置 UIBackgroundModes(如 Dipen Panchasara 链接的答案中所述)以让应用程序继续在后台运行。但该模式仅限于特殊服务(例如 IP 语音,...),比较 developer.apple.com/library/ios/#documentation/general/…
  • @Rohan:我认为您应该在didEnterBackground 中关闭连接并在willEnterForeground 中重新打开连接,但我不能在这里给您真正的建议。 “Technical Note TN2277”似乎包含有价值的信息,也许你从它开始。 - 您的问题是“如何在套接字上设置 SO_KEEPALIVE”,但您真正的问题似乎是“当应用程序进入后台时如何处理打开的连接”。那是不同的事情,所以您可以考虑更新您的问题,或者从新问题开始。

标签: iphone ios objective-c xcode sockets


【解决方案1】:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

在您的 .m 文件中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多