Apple设备===路由器=== WiFi模块是否可以在Apple iOS设备上激活TCP keepalive
Apple设备(iPhone)通过TCP连接连接到WiFi模块端口2000。我想在Apple设备上激活TCP keepalive数据包发送,以了解何时TCP模块的TCP连接丢失(模块关闭)。
我流设置
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)CFBridgingRetain(moduleIPaddress), port2000, &readStream, &writeStream);
outputStream = (NSOutputStream *)CFBridgingRelease(writeStream);
inputStream = (NSInputStream *)CFBridgingRelease(readStream);
[outputStream setDelegate:(id)self];
[inputStream setDelegate:(id)self];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream open];
[inputStream open];
我试图根据大卫小时后Keeping socket connection alive in iOS
- (void) stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {
switch (streamEvent) {
case NSStreamEventOpenCompleted:
if (theStream == outputStream) {
/*
CFDataRef data = (CFDataRef)CFWriteStreamCopyProperty((__bridge CFWriteStreamRef)theStream, kCFStreamPropertySocketNativeHandle);
if(data) {
CFSocketNativeHandle socket_handle = *(CFSocketNativeHandle *)CFDataGetBytePtr(data);
CFRelease(data);
NSLog(@"SOCK HANDLE: %x", socket_handle);
//Enabling keep alive
int opt = 1;
if(setsockopt(socket_handle, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(opt)) < 0)
{
NSLog(@"Yikes 2: failed to set keepalive! ERRNO: %s", strerror(errno));
}
}
*/
NSData *data = (NSData *)[theStream propertyForKey:(__bridge NSString *)kCFStreamPropertySocketNativeHandle];
if(data) {
CFSocketNativeHandle socket_handle = *(CFSocketNativeHandle *)[data bytes];
NSLog(@"SOCK HANDLE: %x", socket_handle);
//Enabling keep alive
int opt = 1;
if(setsockopt(socket_handle, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(opt)) < 0)
{
NSLog(@"Yikes 2: failed to set keepalive! ERRNO: %s", strerror(errno));
}
}
}
两个选项都打印出来SOCK句柄激活存活:9,没有错误消息。当WiFi模块关闭时,当我不向输出流发送数据时,连接仍然保持打开30分钟或更长时间。如果我将数据发送到outputstream,则会在60秒后收到NSStreamEventErrorOccurred - 错误域= NSPOSIXErrorDomain代码= 60“操作无法完成,操作超时”。我尝试过使用Apple设备。当我尝试iOS模拟器时,我没有看到Wireshark的Keepalive数据包。
NSStream tcp keepalive in iOS也描述了keepalive设置。 Martin R示例代码激活了输入流的keepalive,这似乎是错误的。
是否可以在Apple iOS设备上激活TCP keepalive,如iPhone(应该按照David H的说法)?如果有可能应该怎么做(我的代码中缺少什么)?
感谢您的详细调查! – rintaro 2014-09-08 14:06:38
如果上述代码中的某些定义未在您的项目中声明,则必须包含以下内容:#include #include # #include –
Despotovic
2015-12-15 11:35:13
本示例中所选值如何映射到推荐值?我已经尝试过这些设置,但网络在少数设备(约5台)上有些不稳定。我们怀疑这主要是由于'retransmissionTimeout',你会同意吗? – 2015-12-15 18:23:05