Обработка нескольких сокетов
От: homecat  
Дата: 06.01.13 11:30
Оценка:
Пытаюсь написать программу которая:
открывает порт и принимает подключение "клиента" (сокет 1)
получает по этому подключению запрос и обрабатывает его
устанавливает соединение с "сервером"(сокет 2) и запрашивает то что нужно "клиенту"
дальше нужно поддерживать это соединение с "сервером" +
создать новое (сокет 3) и через него связать "клиента"(сокет 1)с "сервером" (чтото типа прокси)
продолжать рулить сервером (сокет 2) т.к. "клиент" сам не умеет.

работу с "клиентом" — реализовал и опробовал

работу с "сервером" — тоже отладил

"чтото типа прокси" — отправить запрос серверу от моей программы и потом можно/нужно связать "клиента"(сокет 1) и "сервер"(сокет 3) "напрямую" (но как это сделать?)

теперь все это вместе и одновременно нужно поддерживать + как минимум обрабатывать двух таких "клиентов"

я так понимаю нужно несколько потоков под это дело:
поток 1 прокси
поток 2 работа с сервером (управление)
поток 3 ждем второго клиента

Как в винде на чистом Си все это лучше реализовать?
(поток прокси может быть автономным до разрыва соединения)

В общем любые полезные идеи и предложения.
Re: Обработка нескольких сокетов
От: Nikolay_Ch Россия  
Дата: 06.01.13 11:36
Оценка:
Здравствуйте, homecat, Вы писали:

H>"чтото типа прокси" — отправить запрос серверу от моей программы и потом можно/нужно связать "клиента"(сокет 1) и "сервер"(сокет 3) "напрямую" (но как это сделать?)

Что значит связать? Самый простой способ отправить клиенту адрес удаленного сервера. Какой протокол Вы придумали?


H>теперь все это вместе и одновременно нужно поддерживать + как минимум обрабатывать двух таких "клиентов"


H>я так понимаю нужно несколько потоков под это дело:

H>поток 1 прокси
H>поток 2 работа с сервером (управление)
H>поток 3 ждем второго клиента
Можно обойтись и одним потокок, если использовать неблокирующиеся сокеты или таймауты.


H>Как в винде на чистом Си все это лучше реализовать?

H>(поток прокси может быть автономным до разрыва соединения)
Так и реализовать. Потоками или при помощи неблокирующихся сокетов.

H>В общем любые полезные идеи и предложения.

Сформулируйте четче, в чем проблема у Вас? Я, кроме того, что Вы не продумали алгоритм работы программы, не вижу никаких проблем.
Re[2]: Обработка нескольких сокетов
От: homecat  
Дата: 06.01.13 12:12
Оценка:
N_C>Что значит связать? Самый простой способ отправить клиенту адрес удаленного сервера. Какой протокол Вы придумали?
протокол "не совсем http", клиент не сможет подключится сразу напрямую.
нужно "инициализировать" сервер, потом подключится еще раз и передать правильный запрос вместо того что пришел от клиента, а вот потом клиент с сервером могут работать и напрямую. При этом нужно поддерживать управление сервером.


N_C>Сформулируйте четче, в чем проблема у Вас? Я, кроме того, что Вы не продумали алгоритм работы программы, не вижу никаких проблем.


в этом тоже проблема а так же в реализации потоков и самое главное проксирование клиента и сервера (еще раз, сам клиент соединение установить не сможет, адрес передавать бесполезно) через уже установленное соединение от клиента.
Re: Обработка нескольких сокетов
От: homecat  
Дата: 06.01.13 15:30
Оценка:
а кстати из нескольких потоков к одному сокету обращатся можно?
если в одном потоке читать а в другом писать друг другу это мешать не будет
Re[3]: Обработка нескольких сокетов
От: Nikolay_Ch Россия  
Дата: 06.01.13 16:38
Оценка:
Здравствуйте, homecat, Вы писали:


N_C>>Что значит связать? Самый простой способ отправить клиенту адрес удаленного сервера. Какой протокол Вы придумали?

H>протокол "не совсем http", клиент не сможет подключится сразу напрямую.
H>нужно "инициализировать" сервер, потом подключится еще раз и передать правильный запрос вместо того что пришел от клиента, а вот потом клиент с сервером могут работать и напрямую. При этом нужно поддерживать управление сервером.
Ну так и действуйте сообразно протоколу...

N_C>>Сформулируйте четче, в чем проблема у Вас? Я, кроме того, что Вы не продумали алгоритм работы программы, не вижу никаких проблем.

H>в этом тоже проблема а так же в реализации потоков и самое главное проксирование клиента и сервера (еще раз, сам клиент соединение установить не сможет, адрес передавать бесполезно) через уже установленное соединение от клиента.
Что за мантру Вы повторяете "проксирование"... У Вас есть описание протокола, как должны действовать локальный сервер, удаленный сервер и клиент? Тогда действуйте сообразно протоколу...
Re: Обработка нескольких сокетов
От: okman Беларусь https://searchinform.ru/
Дата: 06.01.13 17:04
Оценка:
Здравствуйте, homecat, Вы писали:

H>Пытаюсь написать программу которая:

H>открывает порт и принимает подключение "клиента" (сокет 1)
H>получает по этому подключению запрос и обрабатывает его
H>устанавливает соединение с "сервером"(сокет 2) и запрашивает то что нужно "клиенту"
H>дальше нужно поддерживать это соединение с "сервером" +

До этого момента все понятно.

H>создать новое (сокет 3) и через него связать "клиента"(сокет 1)с "сервером" (чтото типа прокси)


А зачем нужен сокет 3 ? Кто с кем тут соединяется ? Сокет 1 (клиент) на этом шаге должен
соединяться с сокетом 2 (сервер) или с сокетом 3 ?

Типичная схема работы прокси примерно такая:
Создаем сокет А, ставим его на прослушивание входящих соединений. При подключении клиента
возвращается сокет B, связанный с TCP-сессией клиента. Дальше создаем сокет C, на котором
выполняется connect с удаленным сервером, после этого рулим данными между сокетами B и C,
туда и обратно, а сокет A продолжает принимать подключения.
Между B и C можно еще какую-нибудь стейт-машину всунуть, например если требуется
разбирать сам протокол.
Re[2]: Обработка нескольких сокетов
От: Nikolay_Ch Россия  
Дата: 06.01.13 17:30
Оценка:
Здравствуйте, 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>разбирать сам протокол.
И?
Re[2]: Обработка нескольких сокетов
От: Nikolay_Ch Россия  
Дата: 06.01.13 17:31
Оценка:
Здравствуйте, homecat, Вы писали:

H>а кстати из нескольких потоков к одному сокету обращатся можно?

H>если в одном потоке читать а в другом писать друг другу это мешать не будет
http://stackoverflow.com/questions/1981372/are-parallel-calls-to-send-recv-on-the-same-socket-valid
Re[3]: Обработка нескольких сокетов
От: okman Беларусь https://searchinform.ru/
Дата: 06.01.13 17:47
Оценка:
Здравствуйте, Nikolay_Ch, Вы писали:

N_C>Это Вам должно быть виднее — зачем. Протокол-то Ваш. Из Вашего описания, честно говоря, ничего непонятно.


Это, наверное, было адресовано homecat, а не мне.
Re[4]: Обработка нескольких сокетов
От: Nikolay_Ch Россия  
Дата: 06.01.13 17:48
Оценка:
Здравствуйте, okman, Вы писали:

O>Это, наверное, было адресовано homecat, а не мне.

Да, извините...
Re: Обработка нескольких сокетов
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 07.01.13 06:00
Оценка:
Здравствуйте, homecat, Вы писали:

H>"чтото типа прокси" — отправить запрос серверу от моей программы и потом можно/нужно связать "клиента"(сокет 1) и "сервер"(сокет 3) "напрямую" (но как это сделать?)


Читать в цикле из одного и писать в другой. И наоборот.

H>Как в винде на чистом Си все это лучше реализовать?

H>(поток прокси может быть автономным до разрыва соединения)

Автомат с выбором активности через select(). А по тредам делить уже большие группы такой активности, а не отдельных клиентов.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.