Некоторые нюансы select() для слушающего сокета

Тема в разделе "WASM.NETWORKS", создана пользователем s3dworld, 21 сен 2011.

  1. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Всем доброго дня!

    Такой вопрос: Если у меня есть слушающий сокет:

    Код (Text):
    1. SOCKET listener=0;
    И для него всё проинициализировано (создан сокет, привязан к локальному адресу и поставлен на прослушивание) и я начинаю выбирать событие в отдельном потоке:

    Код (Text):
    1. fd_set fdsRead;
    2.  
    3. FD_ZERO(&fdsRead);
    4. FD_SET(listener,&fdsRead);
    5.  
    6. result=select(0,&fdsRead,0,0,0);
    То есть тут я делаю блокировку до тех пор, пока не придёт событие на сокет (то есть это обычно пока не подключится клиент).

    ПЕРВЫЙ вопрос: Вот поток у меня заблокирован и ждёт. Если вдруг случится какая-то неполадка, молния стукнула и сетевая плата сгорела (или ещё что-то), тогда я получу в result значение SOCKET_ERROR, а в WSAGetLastError() значение WSAENETDOWN (10050: Операция на сокете обнаружила отключение сети)?

    ВТОРОЙ вопрос: Собственно он унаследован от первого. Та же ситуация, только в место молнии я сделаю так в основном потоке:

    Код (Text):
    1. if(listener)
    2. {
    3.     closesocket(listener);
    4.     listener=0;
    5. }
    Тогда я получу в result значение SOCKET_ERROR, а в WSAGetLastError() значение WSAENOTSOCK (10038: Сделана попытка выполнить операцию на объекте, не являющемся сокетом)?
     
  2. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Если до select, то получите
    Если после, то нет