Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何禁用nagle';iOS中的s算法?_Ios_Iphone_Sockets_Cfsocket_Nagle - Fatal编程技术网

如何禁用nagle';iOS中的s算法?

如何禁用nagle';iOS中的s算法?,ios,iphone,sockets,cfsocket,nagle,Ios,Iphone,Sockets,Cfsocket,Nagle,我正在使用cfwritestream读取和写入iOS的套接字。我需要禁用Nagle的算法,以提高套接字的写入效率,并对其进行了更改,以包括TCP_节点延迟,但是,从pcap日志中,我看不到Nagle的算法已被禁用 下面是我为套接字启用tcp_节点延迟选项的代码。这是在调用wrapsocket将本机套接字包装到cfsocketstream时完成的 // Wrap socket and listen to events if (!sock->cf_socket && !sock

我正在使用cfwritestream读取和写入iOS的套接字。我需要禁用Nagle的算法,以提高套接字的写入效率,并对其进行了更改,以包括TCP_节点延迟,但是,从pcap日志中,我看不到Nagle的算法已被禁用

下面是我为套接字启用tcp_节点延迟选项的代码。这是在调用wrapsocket将本机套接字包装到cfsocketstream时完成的

// Wrap socket and listen to events
if (!sock->cf_socket && !sock->cf_read_stream && !sock->cf_write_stream) {
    sock->cf_socket = CFSocketCreateWithNative(kCFAllocatorDefault,
                                               sock->fd,
                                               kCFSocketReadCallBack | kCFSocketConnectCallBack | kCFSocketWriteCallBack | kCFSocketAcceptCallBack | kCFSocketDataCallBack,
                                               &__CFSocketCallBack,
                                               &socket_context);

        // Don't close underlying socket
        CFReadStreamSetProperty(sock->cf_read_stream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse);
        CFWriteStreamSetProperty(sock->cf_write_stream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse);


        // Setup a context for the streams
        CFStreamClientContext streamContext = { 0, transport, NULL, NULL, NULL };

        // Set the client callback for the stream
        CFReadStreamSetClient(sock->cf_read_stream,
                              kCFStreamEventOpenCompleted | kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered,
                              &__CFReadStreamClientCallBack,
                              &streamContext);
        CFWriteStreamSetClient(sock->cf_write_stream,
                               kCFStreamEventOpenCompleted | kCFStreamEventErrorOccurred | kCFStreamEventCanAcceptBytes |kCFStreamEventEndEncountered,
                               &__CFWriteStreamClientCallBack,
                               &streamContext);


        int yes=1;
        CFDataRef socketData = CFWriteStreamCopyProperty(sock->cf_write_stream, kCFStreamPropertySocketNativeHandle);
        CFSocketNativeHandle handle;
        CFDataGetBytes(socketData, CFRangeMake(0, sizeof(CFSocketNativeHandle)), &handle);
        int result=setsockopt(handle, IPPROTO_TCP , TCP_NODELAY , (void *)&yes, sizeof(yes));

如果我遗漏了什么,请告诉我。

您能给我们看一个小的、相关的pcap输出样本吗?另外,您是否正在检查
int result=setsockopt的值(handle,IPPROTO_TCP,TCP_NODELAY,…
是的,我正在检查返回值。它返回0。在pcap日志中,我看到某个msrp数据包的ACK在长时间(近2秒)后到达设备。在此之前,设备不会发送任何msrp数据包,因为它正在等待前一个数据包的ACK。2秒的delay似乎是一个很难解决的问题。而且您确定发送延迟是TCP级别的,而不是由更高级别的协议(msrp)引起的等待数据?一个线索可能是那些只打开连接确认的数据包,还是它们包含数据?有没有办法让我分享pcap日志片段?我理解你对msrp层延迟的担忧,但似乎不是这样。虽然发送延迟的数据包是数据包。通过谷歌,我发现了其他一些人抱怨iOS会接受TCP_NODELAY选项,但实际上并没有这样做。看起来你看到的情况证实了这一点。如果你能在另一端禁用“延迟确认”,你可能会改善这种情况。