Пытаюсь написать программу которая:
открывает порт и принимает подключение "клиента" (сокет 1)
получает по этому подключению запрос и обрабатывает его
устанавливает соединение с "сервером"(сокет 2) и запрашивает то что нужно "клиенту"
дальше нужно поддерживать это соединение с "сервером" +
создать новое (сокет 3) и через него связать "клиента"(сокет 1)с "сервером" (чтото типа прокси)
продолжать рулить сервером (сокет 2) т.к. "клиент" сам не умеет.
работу с "клиентом" — реализовал и опробовал
работу с "сервером" — тоже отладил
"чтото типа прокси" — отправить запрос серверу от моей программы и потом можно/нужно связать "клиента"(сокет 1) и "сервер"(сокет 3) "напрямую" (но как это сделать?)
теперь все это вместе и одновременно нужно поддерживать + как минимум обрабатывать двух таких "клиентов"
я так понимаю нужно несколько потоков под это дело:
поток 1 прокси
поток 2 работа с сервером (управление)
поток 3 ждем второго клиента
Как в винде на чистом Си все это лучше реализовать?
(поток прокси может быть автономным до разрыва соединения)
Здравствуйте, homecat, Вы писали:
H>"чтото типа прокси" — отправить запрос серверу от моей программы и потом можно/нужно связать "клиента"(сокет 1) и "сервер"(сокет 3) "напрямую" (но как это сделать?)
Что значит связать? Самый простой способ отправить клиенту адрес удаленного сервера. Какой протокол Вы придумали?
H>теперь все это вместе и одновременно нужно поддерживать + как минимум обрабатывать двух таких "клиентов"
H>я так понимаю нужно несколько потоков под это дело: H>поток 1 прокси H>поток 2 работа с сервером (управление) H>поток 3 ждем второго клиента
Можно обойтись и одним потокок, если использовать неблокирующиеся сокеты или таймауты.
H>Как в винде на чистом Си все это лучше реализовать? H>(поток прокси может быть автономным до разрыва соединения)
Так и реализовать. Потоками или при помощи неблокирующихся сокетов.
H>В общем любые полезные идеи и предложения.
Сформулируйте четче, в чем проблема у Вас? Я, кроме того, что Вы не продумали алгоритм работы программы, не вижу никаких проблем.
N_C>Что значит связать? Самый простой способ отправить клиенту адрес удаленного сервера. Какой протокол Вы придумали?
протокол "не совсем http", клиент не сможет подключится сразу напрямую.
нужно "инициализировать" сервер, потом подключится еще раз и передать правильный запрос вместо того что пришел от клиента, а вот потом клиент с сервером могут работать и напрямую. При этом нужно поддерживать управление сервером.
N_C>Сформулируйте четче, в чем проблема у Вас? Я, кроме того, что Вы не продумали алгоритм работы программы, не вижу никаких проблем.
в этом тоже проблема а так же в реализации потоков и самое главное проксирование клиента и сервера (еще раз, сам клиент соединение установить не сможет, адрес передавать бесполезно) через уже установленное соединение от клиента.
N_C>>Что значит связать? Самый простой способ отправить клиенту адрес удаленного сервера. Какой протокол Вы придумали? H>протокол "не совсем http", клиент не сможет подключится сразу напрямую. H>нужно "инициализировать" сервер, потом подключится еще раз и передать правильный запрос вместо того что пришел от клиента, а вот потом клиент с сервером могут работать и напрямую. При этом нужно поддерживать управление сервером.
Ну так и действуйте сообразно протоколу...
N_C>>Сформулируйте четче, в чем проблема у Вас? Я, кроме того, что Вы не продумали алгоритм работы программы, не вижу никаких проблем. H>в этом тоже проблема а так же в реализации потоков и самое главное проксирование клиента и сервера (еще раз, сам клиент соединение установить не сможет, адрес передавать бесполезно) через уже установленное соединение от клиента.
Что за мантру Вы повторяете "проксирование"... У Вас есть описание протокола, как должны действовать локальный сервер, удаленный сервер и клиент? Тогда действуйте сообразно протоколу...
Здравствуйте, homecat, Вы писали:
H>Пытаюсь написать программу которая: H>открывает порт и принимает подключение "клиента" (сокет 1) H>получает по этому подключению запрос и обрабатывает его H>устанавливает соединение с "сервером"(сокет 2) и запрашивает то что нужно "клиенту" H>дальше нужно поддерживать это соединение с "сервером" +
До этого момента все понятно.
H>создать новое (сокет 3) и через него связать "клиента"(сокет 1)с "сервером" (чтото типа прокси)
А зачем нужен сокет 3 ? Кто с кем тут соединяется ? Сокет 1 (клиент) на этом шаге должен
соединяться с сокетом 2 (сервер) или с сокетом 3 ?
Типичная схема работы прокси примерно такая:
Создаем сокет А, ставим его на прослушивание входящих соединений. При подключении клиента
возвращается сокет B, связанный с TCP-сессией клиента. Дальше создаем сокет C, на котором
выполняется connect с удаленным сервером, после этого рулим данными между сокетами B и C,
туда и обратно, а сокет A продолжает принимать подключения.
Между B и C можно еще какую-нибудь стейт-машину всунуть, например если требуется
разбирать сам протокол.
Здравствуйте, okman, Вы писали:
H>>создать новое (сокет 3) и через него связать "клиента"(сокет 1)с "сервером" (чтото типа прокси) O>А зачем нужен сокет 3 ? Кто с кем тут соединяется ? Сокет 1 (клиент) на этом шаге должен O>соединяться с сокетом 2 (сервер) или с сокетом 3 ?
Это Вам должно быть виднее — зачем. Протокол-то Ваш. Из Вашего описания, честно говоря, ничего непонятно.
O>Типичная схема работы прокси примерно такая: O>Создаем сокет А, ставим его на прослушивание входящих соединений. При подключении клиента O>возвращается сокет B, связанный с TCP-сессией клиента. Дальше создаем сокет C, на котором O>выполняется connect с удаленным сервером, после этого рулим данными между сокетами B и C, O>туда и обратно, а сокет A продолжает принимать подключения.
Точно так...
O>Между B и C можно еще какую-нибудь стейт-машину всунуть, например если требуется O>разбирать сам протокол.
И?
Здравствуйте, homecat, Вы писали:
H>"чтото типа прокси" — отправить запрос серверу от моей программы и потом можно/нужно связать "клиента"(сокет 1) и "сервер"(сокет 3) "напрямую" (но как это сделать?)
Читать в цикле из одного и писать в другой. И наоборот.
H>Как в винде на чистом Си все это лучше реализовать? H>(поток прокси может быть автономным до разрыва соединения)
Автомат с выбором активности через select(). А по тредам делить уже большие группы такой активности, а не отдельных клиентов.