Порт маппер TCP
От: MScanner  
Дата: 05.02.13 11:32
Оценка:
Как сделать порт маппер TCP на винсокс.

Поковырял 3proxy нифига не понял.

Может кто то знает как его сделать.

Можно обяснить на пальцах без кода,
что должно делать приложение при приеме коннектов при передаче принятых сообщейний далее в сеть ??
Re: Порт маппер TCP
От: Pasha1st  
Дата: 05.02.13 16:24
Оценка: 7 (1)
Здравствуйте, MScanner, Вы писали:

MS>Как сделать порт маппер TCP на винсокс.


MS>Поковырял 3proxy нифига не понял.


MS>Может кто то знает как его сделать.


MS>Можно обяснить на пальцах без кода,

MS>что должно делать приложение при приеме коннектов при передаче принятых сообщейний далее в сеть ??

1. Вариант попроще, для небольшого количества ожидаемых соединений, "поток на сокет"
В основном потоке крутится принимающий подключения сокет. На каждое входящее подключение создается рабочий поток и туда передается сокет.
В рабочем потоке создаем второй сокет, подключенный далее, и далее гоняем цикл с ожиданием данных с этих двух сокетов. Пришло из первого — добавляем пришедшее к выходному буферу второго и пытаемся передать этот буфер. Если ушло не все, то кроме ожидания входных данных стоит ожидать и возможности доотправить остаток буфера.
Аналогично если пришло из второго — сначала в буфер для первого, и отправляем.
Обязательно следить за тем все ли ушло, если не все — доотправить позже. Если выходном буфере накопилось много данных стоит прекратить чтение из пополняющего сокета.
2. Все то же самое, но можно сделать в одном потоке.
Re[2]: Порт маппер TCP
От: MScanner  
Дата: 05.02.13 17:17
Оценка:
Здравствуйте, Pasha1st, Вы писали:

P>Здравствуйте, MScanner, Вы писали:


MS>>Как сделать порт маппер TCP на винсокс.


MS>>Поковырял 3proxy нифига не понял.


MS>>Может кто то знает как его сделать.


MS>>Можно обяснить на пальцах без кода,

MS>>что должно делать приложение при приеме коннектов при передаче принятых сообщейний далее в сеть ??

P>1. Вариант попроще, для небольшого количества ожидаемых соединений, "поток на сокет"

P>В основном потоке крутится принимающий подключения сокет. На каждое входящее подключение создается рабочий поток и туда передается сокет.
P>В рабочем потоке создаем второй сокет, подключенный далее, и далее гоняем цикл с ожиданием данных с этих двух сокетов. Пришло из первого — добавляем пришедшее к выходному буферу второго и пытаемся передать этот буфер. Если ушло не все, то кроме ожидания входных данных стоит ожидать и возможности доотправить остаток буфера.
P>Аналогично если пришло из второго — сначала в буфер для первого, и отправляем.
P>Обязательно следить за тем все ли ушло, если не все — доотправить позже. Если выходном буфере накопилось много данных стоит прекратить чтение из пополняющего сокета.
P>2. Все то же самое, но можно сделать в одном потоке.

Спасибо!

Такой вопрос можно все сделать через один сокет которые принимает данные от клиента, даже если клиент будет одновременно создавать несколько коннектов?
Re[3]: Порт маппер TCP
От: Pasha1st  
Дата: 06.02.13 18:38
Оценка: 3 (1)
Здравствуйте, MScanner, Вы писали:

MS>>>Как сделать порт маппер TCP на винсокс.

MS>Такой вопрос можно все сделать через один сокет которые принимает данные от клиента, даже если клиент будет одновременно создавать несколько коннектов?
Не очень понял. Сначала создается принимающий сокет, который переводится в listen и с него делается accept для приема подключений. На каждое подключение accept вернет свой сокет-хендл для связи с клиентом. Если придет несколько клиентов, слушающий сокет остается как есть, он просто вернет несколько хендлов.

Подсказка: блокирующим режимом сокетов лучше не пользоваться — нет возможности прервать ожидание, а при ожидании на паре сокетов чтение-запись блокирующее чтение на одном из них блокирует весь поток. Намного лучше перевести сокеты в неблокирующий режим и использовать ожидание через select() — тут можно задать таймаут операции, и select() позволяет ожидать событий сразу на нескольких сокетах.

Подсказка2: select() можно прервать в любой момент. Для этого создается дополнительный UDP-сокет, привязанный к локалхосту, добавляется в мониторинг на "чтение" в select(), а когда требуется ожидание прервать достаточно послать один байт на адрес, к которому привязался UDP-сокет.
Re[4]: Порт маппер TCP
От: MScanner  
Дата: 07.02.13 09:06
Оценка:
Здравствуйте, Pasha1st, Вы писали:



Спасибо!
Re[4]: Порт маппер TCP
От: ononim  
Дата: 14.02.13 14:53
Оценка:
MS>>Такой вопрос можно все сделать через один сокет которые принимает данные от клиента, даже если клиент будет одновременно создавать несколько коннектов?
P>Не очень понял. Сначала создается принимающий сокет, который переводится в listen и с него делается accept для приема подключений. На каждое подключение accept вернет свой сокет-хендл для связи с клиентом. Если придет несколько клиентов, слушающий сокет остается как есть, он просто вернет несколько хендлов.
P>Подсказка: блокирующим режимом сокетов лучше не пользоваться — нет возможности прервать ожидание, а при ожидании на паре сокетов чтение-запись блокирующее чтение на одном из них блокирует весь поток. Намного лучше перевести сокеты в неблокирующий режим и использовать ожидание через select() — тут можно задать таймаут операции, и select() позволяет ожидать событий сразу на нескольких сокетах.
прервать легко — функцией shutdown. То есть простейший код потока будет блокирующе принимать с одного сокета и пересилать на другой. В случае ошибки — делаем shutdown на второй сокет и закрываем первый. На конекшен запускаем два потока — в обе стороны и все будет ок. Но с т.з. перфоманса конечно плохо. Такой код скорее академический.
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.