如何在 iPhone 上的 TCP 连接上禁用 Nagle 算法
Posted
技术标签:
【中文标题】如何在 iPhone 上的 TCP 连接上禁用 Nagle 算法【英文标题】:how to disable Nagle algorithm on TCP connection on iPhone 【发布时间】:2010-06-30 09:41:19 【问题描述】:我正在构建一个套接字,使用
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
(CFStringRef) yourHostAsNSString,
yourPortAsInteger,
&myReadStream,
&myWriteStream);
我看到当我使用“myWriteStream”发送消息时,它会将几条消息连接在一起然后发送它们。
我认为这是因为 Nagle 算法而发生的,我想禁用它。
有谁知道怎么做?
【问题讨论】:
【参考方案1】:不保证这会解决您的问题,但如果您想禁用 Nagle 算法,您需要从流中获取本机套接字并调用 setsockopt
。
CFDataRef nativeSocket = CFWriteStreamCopyProperty(myWriteStream, kCFStreamPropertySocketNativeHandle);
CFSocketNativeHandle *sock = (CFSocketNativeHandle *)CFDataGetBytePtr(nativeSocket);
setsockopt(*sock, IPPROTO_TCP, TCP_NODELAY, &(int) 1 , sizeof(int));
CFRelease(nativeSocket);
(感谢 Mike Ash 的 compound literal 技巧。)
【讨论】:
+1 太好了!您在哪里插入此代码?在 CFStreamCreatePairWithSocketToHost 之后,我得到一个 BAD_EXEC,因为本机套接字尚未启动。 如果您在 CFNetwork 级别工作,请先致电CFWriteStreamOpen
。在打开流的打开之前,连接不存在。如果您的流是 NSStreams,请使用 -[NSStream open]
。
我必须#import <netinet/tcp.h>
来定义 TCP_NODELAY。当然,根据您正在做的其他事情,您当然可以在其中拥有它。
你还需要 #import <netinet/in.h> for the
IPPROTO_TCP` 定义和 setsockopt
自己调用
如果你使用的是NSStreams,你不能直接在-[NSStream open]
之后得到原生的socket。您必须等到您的代表通过stream:handleEvent:
收到NSStreamEventOpenCompleted
。以上是关于如何在 iPhone 上的 TCP 连接上禁用 Nagle 算法的主要内容,如果未能解决你的问题,请参考以下文章
小心你的 WiFi 被禁用,iPhone 又出新Bug,附方法
iPhone 定位服务在连接到 XCode 后显示错误的位置