Окна сокетов C ++ - PullRequest
       18

Окна сокетов C ++

4 голосов
/ 18 февраля 2010

У меня есть вопрос. Я создаю сокет, подключаюсь, отправляю байты, все ок.

и для получения данных я использую функцию recv.

char * TOReceive= new char[200];

recv(ConnectSocket, TOReceive , 200, 0);

когда есть данные, которые он считывает и повторно запускает, успешно, и когда данные не ждут данных, все что мне нужно ограничить время ожидания , например, если 10 секунд нет данных, он должен вернуть.

Большое спасибо.

Ответы [ 3 ]

6 голосов
/ 18 февраля 2010

Windows-сокеты имеют функцию select. Вы передаете ему дескриптор сокета и сокет для проверки читабельности, а также время ожидания, и оно возвращает информацию о том, стал ли сокет доступным для чтения или истекло ли время ожидания.

См .: http://msdn.microsoft.com/en-us/library/ms740141(VS.85).aspx

Вот как это сделать:

bool readyToReceive(int sock, int interval = 1)
{
    fd_set fds;
    FD_ZERO(&fds);
    FD_SET(sock, &fds);

    timeval tv;
    tv.tv_sec = interval;
    tv.tv_usec = 0;

    return (select(sock + 1, &fds, 0, 0, &tv) == 1);
}

Если он возвращает true, ваш следующий вызов recv должен немедленно вернуться с некоторыми данными.

Вы можете сделать это более надежным, проверив select на наличие возвращаемых значений ошибок и выбрасывая исключения в этих случаях. Здесь я просто возвращаю true, если он говорит, что один дескриптор готов к чтению, но это означает, что я возвращаю false при любых других обстоятельствах, включая сокет, который уже закрыт.

0 голосов
/ 18 февраля 2010

Вы можете использовать опцию сокета SO_RCVTIMEO, чтобы указать значение времени ожидания для вызова recv ().

0 голосов
/ 18 февраля 2010

Вы должны вызвать функцию select до вызова recv, чтобы узнать, есть ли что-то для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...