ioctlsocket или recv требует больше времени для выполнения в программировании сокетов Windows? - PullRequest
2 голосов
/ 29 ноября 2011

При программировании сокетов некоторые данные отправляются на сервер, и, как только сервер получает их, отправляет ответное сообщение с подтверждением. это более 1 байта, поэтому я проверяю более одного байта при получении, здесь я теряю около 120-200 мс. Это очень большая проблема. Как клиент должен отправить подтверждение обратно для этого подтверждения. Я обнаружил, что данные поступают на мой IP-адрес одновременно с отправкой сервером. но recv или ioctlsocket (для проверки готовности более 1 байта к считыванию) требуется время для чтения более одного байта. Как я могу решить это. Код выглядит следующим образом.

        DWORD RecvCount = 0;    
        char szBuff1[2048];         
        bool stop = false;          
        while(!stop)
        {               
            ioctlsocket(*socket, FIONREAD, &RecvCount);
            if(RecvCount > 1)
                stop = true;
        }
        int Res = recv(*socket, szBuff1, RecvCount,0);

1 Ответ

2 голосов
/ 29 ноября 2011

Вы должны отключить алгоритм Nagle в Windows, иначе сокет будет сидеть на ваших данных до тех пор, пока буфер не заполнится (или, по крайней мере, подождать пару сотен миллисекунд, прежде чем отправлять его).установив опцию сокета TCP_NODELAY:

int flag = 1;
int result = setsockopt(m_Socket,IPPROTO_TCP,TCP_NODELAY,(char *) &flag,sizeof(int));
...