Сокеты. Сколько данных в буффере?

Тема в разделе "WASM.BEGINNERS", создана пользователем Quark, 15 янв 2008.

  1. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Собственно нужно узнать сколько данных доступно для чтения (для последующего вызова recv).
     
  2. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    ioctlsocket(sock, FIONREAD, mayread), где mayread - DWORD
     
  3. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Пасиб. То, что нужно. Проверка на конец сообщения - если mayread = 0?
     
  4. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Я использую такой способ.

    Код (Text):
    1. /* Функция проверяет заданный промежуток времени возможность чтения из сокета.
    2.    Если такая возможность не появляется возвращает FALSE*/
    3. BOOL TimeOutRead(ULONG TimeOut, SOCKET Sock)
    4. {
    5.     int rc;
    6.     fd_set  readfd;
    7.     struct timeval tv;
    8.  
    9.     FD_ZERO( &readfd );
    10.     FD_SET ( Sock, &readfd );
    11.  
    12.     tv.tv_sec  = TimeOut;
    13.     tv.tv_usec = 0;
    14.  
    15.     rc = select( 0, &readfd, NULL, NULL, &tv );
    16.     if ( rc <= 0 )
    17.         return FALSE; // -1 error, 0 - timeout
    18.     else          
    19.         if (FD_ISSET(Sock, &readfd)) return TRUE;
    20.  
    21.     return FALSE;
    22. }
     
  5. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Quark
    Да, именно. Делаешь цикл, где вызываешь эту функцию, а внутри read(...) с размером твоего буфера, если пришло больше, чем размер твоего буфера, ну или только столько, сколько пришло )
     
  6. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    W4FhLF
    Твой вариант ждет начало прихода данных некоторое время, причем синхронно. Quark спрашивал не совсем об этом.
     
  7. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Xerx Всё-таки select нужно ставить. иначе ioctlsocket(sock, FIONREAD, mayread) часто возвращает mayread = 0, хотя сервер всё ещё передаёт данные. особенно если плохое соединение. Вобщем получилось примерно следующее:

    Код (Text):
    1. unsigned long GetAvailableData(unsigned int h_socket)
    2. {
    3.     unsigned long   dw_nread;
    4.     fd_set      fd_read;
    5.  
    6.  
    7.     fd_read.fd_count    =   1;
    8.     fd_read.fd_array[0] =   h_socket;
    9.  
    10.     if ( select(0,&fd_read,0,0,0) <= 0 ) return 0;
    11.    
    12.     ioctlsocket(h_socket,FIONREAD,&dw_nread);
    13.  
    14.     return dw_nread;
    15. }
    Если функция возвращает 0 - данных больше нет.
    Хотел посмотреть как это делают браузеры - не стал разбираться. opera вся упакована.
     
  8. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Quark
    В вопросе было
    , соответственно я предложил решение именно этого вопроса. Про код получения всех входящих данных речи не шло ) А так само-собой лучше с select(), я ж не спорю :cool:

    P.S. Это все, про UNIX-стиль работы с сокетами. Про асинхронный message-based стиль речь, как понимаю, не идет.

    P.P.S.
    Исходники Mozilla посмотри. Я в свое время интересовался, вполне читабельно и структурировано. Архив порядка 20МБ, если память не подводит.