如何在iPhone上禁用TCP连接上的Nagle算法

如何在iPhone上禁用TCP连接上的Nagle算法,iphone,sockets,tcp,nsstream,Iphone,Sockets,Tcp,Nsstream,我正在用电脑做一个插座 CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef) yourHostAsNSString, yourPortAsInteger, &myRead

我正在用电脑做一个插座

CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
                                       (CFStringRef) yourHostAsNSString,
                                       yourPortAsInteger,
                                       &myReadStream,
                                       &myWriteStream);

CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
(CFStringRef)您的主机ASNSSTRING,
你的笔记本电脑,
&myReadStream,
&myWriteStream);
我看到,当我用“myWriteStream”发送消息时,它会将一些消息连接在一起,然后发送它们。 我想这是因为Nagle算法,我想禁用它。
有人知道怎么做吗?

不能保证这会解决您的问题,但是如果您想禁用Nagle算法,您需要从流中获取本机套接字并调用
setsockopt

CFDataRef nativeSocket = CFWriteStreamCopyProperty(myWriteStream, kCFStreamPropertySocketNativeHandle);
CFSocketNativeHandle *sock = (CFSocketNativeHandle *)CFDataGetBytePtr(nativeSocket);
setsockopt(*sock, IPPROTO_TCP, TCP_NODELAY, &(int){ 1 }, sizeof(int));
CFRelease(nativeSocket);

(向迈克·阿什大声喊出这个把戏。)

+1太棒了!您在哪里插入了此代码?在CFStreamCreatePairWithSocketToHost之后,由于本机套接字尚未启动,我得到了一个错误的\u EXEC。如果您在CFNetwork级别工作,请先调用
CFWriteStreamOpen
。在打开流的open之前,连接不存在。如果您的流是NSStreams,请使用
-[NSStream open]
。我必须为TCP\u节点定义
#导入
。当然,根据您正在执行的其他操作,您可能已经有了它。您还需要为
IPPROTO\u TCP`定义和调用setsockopt导入它自己。如果您使用的是NSStreams,则无法在
-[NSStream open]
之后直接获取本机套接字。您必须等待代理通过
流:handleEvent:
接收到
nsstreamventopencompleted