如何在 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 算法的主要内容,如果未能解决你的问题,请参考以下文章

一个TCP连接上为啥能发起多少个HTTP请求?

小心你的 WiFi 被禁用,iPhone 又出新Bug,附方法

iPhone 定位服务在连接到 XCode 后显示错误的位置

开放连接上的无连接 UDP 与面向连接的 TCP

在 Google Talk XMPP TCP 连接上使用 TLS 使用 PHP

在 iPhone 中禁用数字键盘上的解析