gpt4 book ai didi

objective-c - 在 iOS 中保持套接字连接

转载 作者:太空狗 更新时间:2023-10-30 03:23:55 26 4
gpt4 key购买 nike

我有以下用 Objective-C 编写的代码,用于将数据写入套接字。服务器在 Ubuntu 上运行 node.js:

NSString *url = @"anIPAddress";        
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)url, 9000, &readStream, &writeStream);
self.inputStream = (NSInputStream *)readStream;
self.outputStream = (NSOutputStream *)writeStream;
[self.inputStream setDelegate:self];
[self.outputStream setDelegate:self];
[self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.inputStream open];
[self.outputStream open];

我能够连接到服务器并发送信息。但是我注意到连接在几分钟后超时(我想是 5 分钟左右?)。我怎样才能保持这种联系?我知道断开连接是因为如果我连接到终端下的服务器也会发生同样的事情,我必须保持该连接有效。我想我的代码中也发生了同样的事情。感谢您的帮助!

最佳答案

最简单的答案是尝试使用 SO_KEEPALIVE 套接字选项。

如果端点之间没有数据流动,则很难检测到断开的连接,这使得此选项在某些方面无用,因为它不使用数据来检测断开的连接。但是,很容易添加到您的代码中查看。添加它,看看它是否有帮助...

这是在 C 或 C++ 中的实现方式

int opt = 1;
// Get the native socket handle from your socket class here...
int socket_handle = getNativeSocketHandle( self.outputStream );

/*Enabling keep alive*/
if( setsockopt( socket_handle, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof( opt ) ) < 0 )
{
// failed setting socket option
}

不太简单的答案是在您的协议(protocol)中添加一个 ping 数据包并定期发送该 ping 数据包,这样您就可以检测到断开的连接。

关于objective-c - 在 iOS 中保持套接字连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11387560/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com