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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> select(), Есть ли логическая ошибка? 
V
    Опции темы
Pete
Дата 7.7.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

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



Правильно ли я понимаю, как она работает?
Здесь c_sock и extsd -- 2 сокета (TCP). Я их отслеживаю на предмет появления новых символов. Если в какой-то сокет что-то приходит, перенаправляю это в другой и наоборот (см. resend()). Если какой-то сокет закрыт, то, насколько я понял, select() вывалится и это событие отловится изменением соответствующего дескриптора в 3-ем наборе (efds).
В maxfd хранится максимальный из файловых дескрипторов из набора (наборы одинаковы: c_sock и extsd).

Код
FD_ZERO( &rfds );
FD_ZERO( &efds );
FD_SET( c_sock, &rfds );
FD_SET( c_sock, &efds );
maxfd = c_sock;
/* ..... */
FD_SET( extsd, &rfds );
FD_SET( extsd, &efds );
maxfd = (extsd > maxfd ? extsd : maxfd);


Это код, в правильности которого я сомневаюсь:

Код
if (select( maxfd + 1, &rfds, NULL, &efds, NULL ) < 0 ) {
  printf( "ERROR: %s:%d: %s\n", __FILE__, __LINE__, strerror( errno ) );
  exit( EXIT_FAILURE );
} else {
  
  if        (FD_ISSET( c_sock, &efds )) {
    close( extsd );
    puts( "> Connection closed." );
    exit( EXIT_SUCCESS );
  } else if (FD_ISSET( extsd,  &efds )) {
    puts( "Remote server disconnected." );
  }
  
  if        (FD_ISSET( extsd,  &rfds )) {
    n = resend( extsd, c_sock );
    printf( "> %d bytes was sent by server\n", n );
  } else if (FD_ISSET( c_sock, &rfds )) {
    n = resend( c_sock, extsd );
    printf( "> %d bytes was sent by client\n", n );
  } else
    printf( "ERROR: %s:%d: %s\n", __FILE__, __LINE__, strerror( errno ) );
  
}


А вот и resend():

Код
int
resend( int from, int to )
{
  int  n;
  int  s = 0;
  char buf[MAX_BUF_LEN];
  
  while ((n = read( from, buf, MAX_BUF_LEN )) > 0)
    {
      write( to, buf, n );
      s += n;
      if (n < MAX_BUF_LEN) break;
    }
  
  return s;
}
 


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
bsa
Дата 7.7.2006, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



И в чем проблема?
На первый взгляд должно работать. Я использовал select. Ничего непредсказуемого не заметил. 
PM   Вверх
Pete
Дата 8.7.2006, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

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



Должно-то оно должно, только не работает. Проблема в том, что когда клиент пишет что-то в сокет (send'ом), сервак должен это прочитать и ответить (recv'ом). Фактически, вышеизложенный код --- часть проги-посредника между клиентом и сервером (реализую SOCKS).

Клиент передет нормально, сервак принимает нормально, но когда последний хочет ответить, то посредник виснет на select'е.

Потом мне объяснили, что если указать сокет в 3-ем наборе дескрипторов, то при его закрытии select вываливается, а FD_ISSET от него становится истинным. Это тоже у меня не получилось подтвердить.

В общем, где-то скрыто глобальное непонимание, что очень мешает заставить прогу работать... 


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
GrayCardinal
Дата 8.7.2006, 05:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


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

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



select вроде вываливается не по ошибке если данных нет, а по чтению EOF. Т.е. read должен ноль выдавать, а у вас resend такое не обрабатывает...

Добавлено @ 06:03 
Цитата
... a file descriptor is also ready on end-of-file ...

smile
 


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

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



Проблемы с read я уже решил. Меня больше интересует вопрос, почему сервак в ответ клиенту на своем конце что-то пихает, а socks-сервер ждет как ни в чем не бывало...

Добавлено @ 21:10 
...вместо того, чтобы переслать это клиенту. 


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
bsa
Дата 9.7.2006, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



А ты уверен, что socks ждет именно данные от сервера? 
PM   Вверх
Pete
Дата 9.7.2006, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

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



Как мне объяснили, он ждет данные и от сервера, и от клиента.

Что только я не пробовал, никакого продвижения. Посылаю в сервере сообщение клиенту, а socks-сервак встает на select. Даже не знаю, что делать. 


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
Pete
Дата 10.7.2006, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

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



Все, разобрался. Дело было в том, что я не востанавливал fd_set'ы после каждого выхода из select()smile 
Говорил же: банальная ошибка, а сколько времени ушло на ее поиск! smile 
Можно закрывать) smile  


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
GrayCardinal
Дата 11.7.2006, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


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

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



Цитата
Говорил же: банальная ошибка

В следующий раз сразу строчку говорите, где собственно банальная ошибка smile  smile  smile  smile  


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

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



Дело не в строчке, а в понимании (точнее, непонимании) работы функции. 

Если кому интересно, надо было добавить во втором блоке кода, сразу перед выходом из if (строка 22), это:

Код

FD_ZERO( &rfds );
FD_ZERO( &efds );

FD_SET( c_sock, &rfds );
FD_SET( extsd,  &rfds );
FD_SET( c_sock, &efds );
FD_SET( extsd,  &efds );


Добавлено @ 00:32 
Спасибо за помощь! 


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
Einstein
Дата 16.7.2006, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день, подскажите хто сможет, я приехал с Канады и мне нужен совет по поводу компании где можно устроится в Киеве. Я программист С++. Заранее благодарен 
PM MAIL   Вверх
GrayCardinal
Дата 16.7.2006, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


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

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



Цитата

Добрый день, подскажите хто сможет, я приехал с Канады и мне нужен совет по поводу компании где можно устроится в Киеве. Я программист С++. Заранее благодарен

А ты приколист. smile smile smile
А что в Киев ? Дуй в Сибирь. Медведей правда не обещаю smile Да и чтоб устроится надо 100т строк самопалки. У вас их есть ? 


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

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

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


 




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


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

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