![]() |
|
Модераторы: xvr |
![]()
|
|
| Pete |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 318 Регистрация: 5.1.2006 Где: Москва Репутация: нет Всего: 12 |
Правильно ли я понимаю, как она работает?
Здесь c_sock и extsd -- 2 сокета (TCP). Я их отслеживаю на предмет появления новых символов. Если в какой-то сокет что-то приходит, перенаправляю это в другой и наоборот (см. resend()). Если какой-то сокет закрыт, то, насколько я понял, select() вывалится и это событие отловится изменением соответствующего дескриптора в 3-ем наборе (efds). В maxfd хранится максимальный из файловых дескрипторов из набора (наборы одинаковы: c_sock и extsd).
Это код, в правильности которого я сомневаюсь:
А вот и resend():
-------------------- Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу) Не откладывай на завтра то, что можешь сделать сегодня. (Пословица) А теперь выпишем точное значение числа пи... (Препод) Жахни, Пендальф! © Гоблин |
||||||
|
|||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
И в чем проблема?
На первый взгляд должно работать. Я использовал select. Ничего непредсказуемого не заметил. |
|||
|
||||
| Pete |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 318 Регистрация: 5.1.2006 Где: Москва Репутация: нет Всего: 12 |
Должно-то оно должно, только не работает. Проблема в том, что когда клиент пишет что-то в сокет (send'ом), сервак должен это прочитать и ответить (recv'ом). Фактически, вышеизложенный код --- часть проги-посредника между клиентом и сервером (реализую SOCKS).
Клиент передет нормально, сервак принимает нормально, но когда последний хочет ответить, то посредник виснет на select'е. Потом мне объяснили, что если указать сокет в 3-ем наборе дескрипторов, то при его закрытии select вываливается, а FD_ISSET от него становится истинным. Это тоже у меня не получилось подтвердить. В общем, где-то скрыто глобальное непонимание, что очень мешает заставить прогу работать... -------------------- Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу) Не откладывай на завтра то, что можешь сделать сегодня. (Пословица) А теперь выпишем точное значение числа пи... (Препод) Жахни, Пендальф! © Гоблин |
|||
|
||||
| GrayCardinal |
|
|||
|
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
select вроде вываливается не по ошибке если данных нет, а по чтению EOF. Т.е. read должен ноль выдавать, а у вас resend такое не обрабатывает...
Добавлено @ 06:03
|
|||
|
||||
| Pete |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 318 Регистрация: 5.1.2006 Где: Москва Репутация: нет Всего: 12 |
Проблемы с read я уже решил. Меня больше интересует вопрос, почему сервак в ответ клиенту на своем конце что-то пихает, а socks-сервер ждет как ни в чем не бывало...
Добавлено @ 21:10 ...вместо того, чтобы переслать это клиенту. -------------------- Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу) Не откладывай на завтра то, что можешь сделать сегодня. (Пословица) А теперь выпишем точное значение числа пи... (Препод) Жахни, Пендальф! © Гоблин |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
А ты уверен, что socks ждет именно данные от сервера?
|
|||
|
||||
| Pete |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 318 Регистрация: 5.1.2006 Где: Москва Репутация: нет Всего: 12 |
Как мне объяснили, он ждет данные и от сервера, и от клиента.
Что только я не пробовал, никакого продвижения. Посылаю в сервере сообщение клиенту, а socks-сервак встает на select. Даже не знаю, что делать. -------------------- Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу) Не откладывай на завтра то, что можешь сделать сегодня. (Пословица) А теперь выпишем точное значение числа пи... (Препод) Жахни, Пендальф! © Гоблин |
|||
|
||||
| Pete |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 318 Регистрация: 5.1.2006 Где: Москва Репутация: нет Всего: 12 |
Все, разобрался. Дело было в том, что я не востанавливал fd_set'ы после каждого выхода из select().
Говорил же: банальная ошибка, а сколько времени ушло на ее поиск! Можно закрывать) -------------------- Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу) Не откладывай на завтра то, что можешь сделать сегодня. (Пословица) А теперь выпишем точное значение числа пи... (Препод) Жахни, Пендальф! © Гоблин |
|||
|
||||
| GrayCardinal |
|
|||
|
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
В следующий раз сразу строчку говорите, где собственно банальная ошибка |
|||
|
||||
| Pete |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 318 Регистрация: 5.1.2006 Где: Москва Репутация: нет Всего: 12 |
Дело не в строчке, а в понимании (точнее, непонимании) работы функции.
Если кому интересно, надо было добавить во втором блоке кода, сразу перед выходом из if (строка 22), это:
Добавлено @ 00:32 Спасибо за помощь! -------------------- Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу) Не откладывай на завтра то, что можешь сделать сегодня. (Пословица) А теперь выпишем точное значение числа пи... (Препод) Жахни, Пендальф! © Гоблин |
|||
|
||||
| Einstein |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 16.7.2006 Репутация: нет Всего: нет |
Добрый день, подскажите хто сможет, я приехал с Канады и мне нужен совет по поводу компании где можно устроится в Киеве. Я программист С++. Заранее благодарен
|
|||
|
||||
| GrayCardinal |
|
|||
|
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
А ты приколист. А что в Киев ? Дуй в Сибирь. Медведей правда не обещаю |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |