Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > C/C++ > C/C++
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.02.2015, 00:34
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию Ошибка select

Пример:
Код:
    sock = accept(sc, NULL, NULL);
    u_long mode = 1;
    ioctlsocket(sock, FIONBIO, &mode);
    sleep(1000);
    size = recv(sock, ...);
работает нормально, данные приходят. А теперь финт ушами:
Код:
    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)
    {
         ec = WSAGetLastError();
         return;
    }
    size = recv(sock, ...);
и получаю SOCKET_ERROR, WSAGetLastError выдает WSAENOTSOCK ("не сокет").
Еще один финт ушами: не делаем return. И данные успешно приходят.

Что происходит? Почему sock - "не сокет" для select'а, но для recv'а и ioctlsocket'а - вполне себе сокет?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 07.02.2015 в 00:36.
Ответить с цитированием
  #2  
Старый 07.02.2015, 12:37
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Для селекта вроде надо +1 делать от хэндла сокета.
Код:
select(sock+1
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 07.02.2015, 13:06
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Это в линухах надо, а в винде - нет:
Цитата:
Сообщение от MSDN
Parameters
nfds [in]
Ignored. The nfds parameter is included only for compatibility with Berkeley sockets.
И в рабочем примере из другого проекта (только там был клиент, а не сервер) тоже 0, и все работает.

В общем переделал на WSAEventSelect + WaitForSingleObject, и все стало нормально. В топку линкусовые селекты.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:47.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter