【问题标题】:how to disable Nagle algorithm on TCP connection on iPhone如何在 iPhone 上的 TCP 连接上禁用 Nagle 算法
【发布时间】:2010-06-30 09:41:19
【问题描述】:

我正在构建一个套接字,使用


CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
                                       (CFStringRef) yourHostAsNSString,
                                       yourPortAsInteger,
                                       &myReadStream,
                                       &myWriteStream);
我看到当我使用“myWriteStream”发送消息时,它会将几条消息连接在一起然后发送它们。 我认为这是因为 Nagle 算法而发生的,我想禁用它。 有谁知道怎么做?

【问题讨论】:

    标签: iphone sockets tcp nsstream


    【解决方案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
    猜你喜欢
    • 2016-01-22
    • 2020-07-10
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 2016-02-08
    相关资源
    最近更新 更多