Пожалуйста, растолкуйте, что должно произойти, когда сервер получил команду CONNECT от клиента и создал соединение с указанным хостом по указанному порту.
Правильно ли я понимаю, что после этого:
1. Сервер создаёт слушающий сокет
2. Адрес именно этого сокета отсылает клиенту в ответе
3. Ждёт, когда произойдёт подключение на этот сокет и accept'ит его
4. Всё, что прислано через это подключение отсылает удалённому хосту и наоборот
Похоже, что я чего-то не понимаю. Написал socks5-сервер, работающий по описанному алгоритму... Ни одна программа через него работать не может. Вот например лог сессии с miranda-icq (справа от символов > и < hex dump данных, полученных от клиента и отосланных ему, соотвественно):
# new client connected: 127.0.0.1:2751
[127.0.0.1:2751] > 05 01 00
[127.0.0.1:2751] < 05 00
[127.0.0.1:2751] > 05 01 00 01 40 0c a1 99 14 46
[127.0.0.1:2751] # new pipe to 64.12.161.153:5190 created (listen on 89.110.10.178:32768)
[127.0.0.1:2751] # command CONNECT 64.12.161.153:5190 (success)
[127.0.0.1:2751] < 05 00 00 01 59 6e 0a b2 80 00
То есть сервер ждёт подключение на 89.110.10.178:32768, но его не происходит. Мне непонятно почему
Я написал также тестового клиента, который получив в ответе на комманду CONNECT ip и порт сразу открывает соединение по этому адресу (после чего закрывает его и отключается от сервера). Тогда всё ок, вот лог:
# new client connected: 127.0.0.1:2762
[127.0.0.1:2762] > 05 01 00
[127.0.0.1:2762] < 05 00
[127.0.0.1:2762] > 05 01 00 01 d5 b4 cc 08 00 50
[127.0.0.1:2762] # new pipe to 213.180.204.8:80 created (listen on 89.110.10.178:32768)
[127.0.0.1:2762] # command CONNECT 213.180.204.8:80 (success)
[127.0.0.1:2762] < 05 00 00 01 59 6e 0a b2 80 00
[127.0.0.1:2762] # pipe to 213.180.204.8:80 activated
[127.0.0.1:2762] # pipe to 213.180.204.8:80 destroyed (client disconnecting)
# client disconnected: 127.0.0.1:2762
При этом мой тестовый клиент не работает с другими socks5-proxy серверами (с которыми работают остальные клиенты, в частности, miranda-icq).
Пожалуйста, помогите решить проблему. А то я уже пару суток мучаюсь, не зная что делать
Здравствуйте, ivlad, Вы писали:
I>Пожалуйста, растолкуйте, что должно произойти, когда сервер получил команду CONNECT от клиента и создал соединение с указанным хостом по указанному порту.
I>Правильно ли я понимаю, что после этого:
I>1. Сервер создаёт слушающий сокет
I>2. Адрес именно этого сокета отсылает клиенту в ответе
I>3. Ждёт, когда произойдёт подключение на этот сокет и accept'ит его
I>4. Всё, что прислано через это подключение отсылает удалённому хосту и наоборот
I>Похоже, что я чего-то не понимаю. Написал socks5-сервер, работающий по описанному алгоритму... Ни одна программа через него работать не может. Вот например лог сессии с miranda-icq (справа от символов > и < hex dump данных, полученных от клиента и отосланных ему, соотвественно):
I># new client connected: 127.0.0.1:2751
I>[127.0.0.1:2751] > 05 01 00
I>[127.0.0.1:2751] < 05 00
I>[127.0.0.1:2751] > 05 01 00 01 40 0c a1 99 14 46
I>[127.0.0.1:2751] # new pipe to 64.12.161.153:5190 created (listen on 89.110.10.178:32768)
I>[127.0.0.1:2751] # command CONNECT 64.12.161.153:5190 (success)
I>[127.0.0.1:2751] < 05 00 00 01 59 6e 0a b2 80 00
То есть сервер ждёт подключение на 89.110.10.178:32768, но его не происходит. Мне непонятно почему
I>Я написал также тестового клиента, который получив в ответе на комманду CONNECT ip и порт сразу открывает соединение по этому адресу (после чего закрывает его и отключается от сервера). Тогда всё ок, вот лог:
I># new client connected: 127.0.0.1:2762
I>[127.0.0.1:2762] > 05 01 00
I>[127.0.0.1:2762] < 05 00
I>[127.0.0.1:2762] > 05 01 00 01 d5 b4 cc 08 00 50
I>[127.0.0.1:2762] # new pipe to 213.180.204.8:80 created (listen on 89.110.10.178:32768)
I>[127.0.0.1:2762] # command CONNECT 213.180.204.8:80 (success)
I>[127.0.0.1:2762] < 05 00 00 01 59 6e 0a b2 80 00
I>[127.0.0.1:2762] # pipe to 213.180.204.8:80 activated
I>[127.0.0.1:2762] # pipe to 213.180.204.8:80 destroyed (client disconnecting)
I># client disconnected: 127.0.0.1:2762
При этом мой тестовый клиент не работает с другими socks5-proxy серверами (с которыми работают остальные клиенты, в частности, miranda-icq).
I>Пожалуйста, помогите решить проблему. А то я уже пару суток мучаюсь, не зная что делать
Я пока не заметил расхождений вашей реализации с RFC (может тоже чего-то не заметил).
Можете написать лог того, как отрабатывает ваш тестовый клиент при работе с другими SOCKS5 серверами?
Мне тут еще мысль пришла: Вы ожидаете другие команды (типа BIND) параллельно с ожиданием коннекта?
Здравствуйте, Stuw, Вы писали:
S>Я пока не заметил расхождений вашей реализации с RFC (может тоже чего-то не заметил).
И зря не заметили. Я разобрался. На самом деле по спецификации обмен данными между клиентом и удалённым хостом должен осуществляться _в том же_ соединении сразу после успешного CONNECT.
Переписал код, сейчас всё работает

Сижу в icq через собственноручно напрограммированный php socks5 proxy
Здравствуйте, ivlad, Вы писали:
I>Здравствуйте, Stuw, Вы писали:
S>>Я пока не заметил расхождений вашей реализации с RFC (может тоже чего-то не заметил).
I>И зря не заметили. Я разобрался. На самом деле по спецификации обмен данными между клиентом и удалённым хостом должен осуществляться _в том же_ соединении сразу после успешного CONNECT.
I>Переписал код, сейчас всё работает
Сижу в icq через собственноручно напрограммированный php socks5 proxy 
+1
4й так же работает, но тогда зачем сокс шлёт ip и порт?
Здравствуйте, Ruweb, Вы писали:
R>Здравствуйте, ivlad, Вы писали:
I>>Здравствуйте, Stuw, Вы писали:
S>>>Я пока не заметил расхождений вашей реализации с RFC (может тоже чего-то не заметил).
I>>И зря не заметили. Я разобрался. На самом деле по спецификации обмен данными между клиентом и удалённым хостом должен осуществляться _в том же_ соединении сразу после успешного CONNECT.
I>>Переписал код, сейчас всё работает
Сижу в icq через собственноручно напрограммированный php socks5 proxy
R>+1
R>4й так же работает, но тогда зачем сокс шлёт ip и порт?
В пятом йи и порт юзаются для UDP