Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WSAENOTSOCK в select 
:(
    Опции темы
Bargest
Дата 6.2.2015, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 6.2.2015

Репутация: нет
Всего: нет



Пытаюсь подключить клиента и сразу же проверить наличие данных для приема:
Код

    SOCKET sc = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    sockaddr_in sa;
    sa.sin_addr.s_addr = INADDR_ANY;
    sa.sin_port = htons(23946);
    sa.sin_family = AF_INET;
    int res = bind((SOCKET)sc, (sockaddr *)&sa, (int)sizeof(sockaddr_in));
    listen(sc, SOMAXCONN);
    sock = accept(sc, NULL, NULL);
    u_long mode = 1;
    ioctlsocket(sock, FIONBIO, &mode);
    timeval t = { 0, 0 };
    fd_set read_fd;
    FD_ZERO(&read_fd);
    FD_SET(sock, &read_fd);
    if (select(0, &read_fd, 0, 0, &t) == SOCKET_ERROR)
    {
        int err = WSAGetLastError();
        return ;
    }

И select выдает SOCKET_ERROR, код ошибки - WSAENOTSOCK ("не сокет"). MSDN говорит, что select возвращает эту ошибку, если в структуре fd_set одно из полей не является сокетом.
При этом если я не использую select, а просто принимаю данные:
Код

int size = recv(sock, (char*)buf, 512, 0);

То данные благополучно приходят.
Пробовал делать ожидание после accept'а, пробовал делать в блокирующем режиме (с NULL вместо таймаута) - результат один и тот же.
Изначально эта проверка select'ом делалась в другом месте, но сейчас в поисках баги я уже перенес эту проверку вплотную к accept'у. И все равно получаю этот WSAENOTSOCK.
Что тут не так?

Это сообщение отредактировал(а) Bargest - 7.2.2015, 00:10
PM   Вверх
feodorv
Дата 7.2.2015, 04:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(Bargest @  6.2.2015,  23:48 Найти цитируемый пост)
Что тут не так?

На вид все так, только Вы не проверили, что sock не равен INVALID_SOCKET. Но раз
Цитата(Bargest @  6.2.2015,  23:48 Найти цитируемый пост)
если я не использую select, а просто принимаю данные
работает, то сокет, вроде рабочий. А какой тип у переменной sock?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
feodorv
Дата 7.2.2015, 04:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(Bargest @  6.2.2015,  23:48 Найти цитируемый пост)
    SOCKET sc = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);

Может, вместо IPPROTO_IP тупо 0 поставить?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Bargest
Дата 7.2.2015, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 6.2.2015

Репутация: нет
Всего: нет



Цитата
что sock не равен INVALID_SOCKET

В дебаге проверял, там 0x68. Вполне нормальный сокет.
Цитата
А какой тип у переменной sock? 

Код

SOCKET sock;

Цитата
Может, вместо IPPROTO_IP тупо 0 поставить? 

Код

// из ws2def.h
#define IPPROTO_IP              0

В общем, так и не поняв, в чем была проблема, переделал на WSAEventSelect + WaitForSingleObject и стало нормально.
Вопрос более не актуален.

Это сообщение отредактировал(а) Bargest - 7.2.2015, 13:12
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0427 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.