Hah*_*ann 11 sockets timeout objective-c keep-alive ios5
我有以下用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
}
不那么简单的答案是ping在协议中添加数据包并定期发送ping数据包,以便检测断开的连接.
我找到了如何做到这一点。由于服务器正在运行node.js,所以我使用了
socket.setKeepAlive(true, 2000);
通过这种方式,节点保持每个套接字打开。默认值为 false,因此这就是超时的原因。我希望这对其他人有用。感谢您的回复,我认为保持心跳(保持活动)也是一个好主意,但是使用这个本机方法节点可以解决它。
| 归档时间: | 
 | 
| 查看次数: | 12495 次 | 
| 最近记录: |