Как отключить алгоритм nagle в iOS?

Я использую cfwritestream для чтения и записи в сокет для iOS. Мне нужно отключить алгоритм Nagle, чтобы повысить эффективность записи сокета и внести изменения, чтобы включить TCP_NODELAY, однако из журналов pcap я не вижу, чтобы алгоритм Nagle был отключен.

Ниже приведен фрагмент кода для включения опции tcp_nodelay для сокета. Это делается во время вызова 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));

Пожалуйста, дайте мне знать, если я что-то упустил.

0 ответов

Другие вопросы по тегам