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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> select после listen при работе с сокетами, работает не так как хотелось бы) 
:(
    Опции темы
tempman
Дата 17.12.2006, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Такая ситуация:
Код

//ставим сокет на прослушивание
listen (sock,10);
//onesec - структура  timeval с 1 секундой

fd_set rfds;
int retval;
FD_ZERO(&rfds);
FD_SET (banswer_sock,&rfds);
if (select (1, &rfds, NULL,NULL, &onesec)<0)
{    printf("ERROR SELECT!");    perror("select");}


if(!FD_ISSET(sock,&rfds))        // если в сокет возможно чтение
{
    printf("4tenie");
    ...
         ...
         close(banswer_sock);
    
}
else                 
{
    ....
}
 



и есть две ситуации :
1. код срабатывает когда другая програма делает  conect  к этой проге
2. код срабатывает когда другая прога не делает конекта к этой проге

в обоих случаях макрос FD_ISSET(sock,&rfds)  возвращает ноль т.е.  в сокет возможно чтение

как я понимаю  макрос FD_ISSET(sock,&rfds) должен возвращать ноль в том случае конда к сокету идет  conect с другого сетевого интерфейса ...  или я в чем то не прав?
т.е. как написано в этом доке тут :

readfds: 
если сокет находится в режиме прослушивания и пришел запрос на соединение, функция accept будет выполнена успешно. 
данные доступны для чтения (включая данные OOB, если SO_OOBINLINE включена). 
соединение было закрыто/прервано.

Добавлено @ 07:04 
промучался пол ночи так и не понял )
пошел спать,  буду ждать вашей помощи :-)

спасибо заранее)

Это сообщение отредактировал(а) tempman - 17.12.2006, 07:03
PM MAIL   Вверх
GrayCardinal
Дата 17.12.2006, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

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



Цитата

если сокет находится в режиме прослушивания и пришел запрос на соединение, функция accept будет выполнена успешно. 

Ну, правильно написано smile

FD_ISSET на то и "IS SET", чтоб возвращать true, когда есть что-то для данного дескриптора. Т.е когда вы делаете несколько FD_SET, то после "select" надо каждый проверять - какой сработал (FD_ISSET) ?
(либо "!" убери перед FD_ISSET либо комменты поменяй на ротивоположные по смыслу)
И надо не забыть переустановить дескрипторы перед повторным вызовом...

Добавлено @ 08:28 
Цитата

1. код срабатывает когда другая програма делает  conect  к этой проге
2. код срабатывает когда другая прога не делает конекта к этой проге

Ага ?
Замени
select (1, &rfds, NULL,NULL, &onesec)
на
select(sock+1, &rfds,NULL,NULL, &onesec)
Хитрая грабля. Сам ходил smile

Добавлено @ 08:33 
P.S>
Это *nix, тут все работает так как надо, а не так как хочется 
 smile 

Это сообщение отредактировал(а) GrayCardinal - 17.12.2006, 08:29


--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 17.12.2006, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата

Хитрая грабля. Сам ходил

не, это чистейший man  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
GrayCardinal
Дата 17.12.2006, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

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



MAKCim, 
Ну, это уже после грабли и с шышкой smile


--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 17.12.2006, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата

Ну, это уже после грабли и с шышкой

ха, а как ты ее без man-а то в первый раз использовал?
по такому прототипу
Код

int select(int n, fd_set *readfds, <и т. д>);

хз, что такое n  smile 
или по интуиции?  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
GrayCardinal
Дата 17.12.2006, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

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



Цитата

или по интуиции? 

По логике вообще-то  smile 


--------------------
PM MAIL WWW   Вверх
tempman
Дата 17.12.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
FD_ISSET на то и "IS SET", чтоб возвращать true, когда есть что-то для данного дескриптора. Т.е когда вы делаете несколько FD_SET, то после "select" надо каждый проверять - какой сработал (FD_ISSET) ?
(либо "!" убери перед FD_ISSET либо комменты поменяй на ротивоположные по смыслу)

как же так , читал  в каком то мане/доке :-) что макрос FD_ISSET  возвращает ноль если  дескриптр находится в проверяемом наборе ... следовательно и не ноль если не находится ...может конечно читал очень поздно и что то не так прочитал ...

....

так прочитал только что еще раз док на который ссылаюсь ,похоже меня кто то жестоко обманул :-)    FD_ISSET возвращает НЕ ноль  если дескриптор находится в наборе после селекта :-)  но я 100% помню что в каком то русском "типа мане" в нете было написано наоборот :-(( проехали , идем дальше

Цитата

И надо не забыть переустановить дескрипторы перед повторным вызовом...


а подробнее?  у меня селект как селект так и FD_ISSET вызывается всего один раз за прогу при иницилизации :-)

Цитата

select(sock+1, &rfds,NULL,NULL, &onesec)
Хитрая грабля. Сам ходил smile



Блин , точно в мане написано , читать надо было внимательноее ...  сч а внесус коррективы скажу :-)

Добавлено @ 14:26 
Цитата(GrayCardinal @ 17.12.2006,  12:53)
Цитата

или по интуиции? 

По логике вообще-то  smile

ступил , ступил :-)

в примере в мане рассматривается      декриптр  стдина   который =0 :-)   вот там то и стоит еденица в селекте ) ну я и взял не подумав :-)))

Добавлено @ 14:30 
супер !!!  все работает :-))

всем спасибо 
буду сюда еще писать если траблы какие будут , буду надеяться на такую же  помощь smile

Это сообщение отредактировал(а) tempman - 17.12.2006, 14:32
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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