Здравствуйте, MScanner, Вы писали:
MS>Как сделать порт маппер TCP на винсокс.
MS>Поковырял 3proxy нифига не понял.
MS>Может кто то знает как его сделать.
MS>Можно обяснить на пальцах без кода, MS>что должно делать приложение при приеме коннектов при передаче принятых сообщейний далее в сеть ??
1. Вариант попроще, для небольшого количества ожидаемых соединений, "поток на сокет"
В основном потоке крутится принимающий подключения сокет. На каждое входящее подключение создается рабочий поток и туда передается сокет.
В рабочем потоке создаем второй сокет, подключенный далее, и далее гоняем цикл с ожиданием данных с этих двух сокетов. Пришло из первого — добавляем пришедшее к выходному буферу второго и пытаемся передать этот буфер. Если ушло не все, то кроме ожидания входных данных стоит ожидать и возможности доотправить остаток буфера.
Аналогично если пришло из второго — сначала в буфер для первого, и отправляем.
Обязательно следить за тем все ли ушло, если не все — доотправить позже. Если выходном буфере накопилось много данных стоит прекратить чтение из пополняющего сокета.
2. Все то же самое, но можно сделать в одном потоке.
Здравствуйте, Pasha1st, Вы писали:
P>Здравствуйте, MScanner, Вы писали:
MS>>Как сделать порт маппер TCP на винсокс.
MS>>Поковырял 3proxy нифига не понял.
MS>>Может кто то знает как его сделать.
MS>>Можно обяснить на пальцах без кода, MS>>что должно делать приложение при приеме коннектов при передаче принятых сообщейний далее в сеть ??
P>1. Вариант попроще, для небольшого количества ожидаемых соединений, "поток на сокет" P>В основном потоке крутится принимающий подключения сокет. На каждое входящее подключение создается рабочий поток и туда передается сокет. P>В рабочем потоке создаем второй сокет, подключенный далее, и далее гоняем цикл с ожиданием данных с этих двух сокетов. Пришло из первого — добавляем пришедшее к выходному буферу второго и пытаемся передать этот буфер. Если ушло не все, то кроме ожидания входных данных стоит ожидать и возможности доотправить остаток буфера. P>Аналогично если пришло из второго — сначала в буфер для первого, и отправляем. P>Обязательно следить за тем все ли ушло, если не все — доотправить позже. Если выходном буфере накопилось много данных стоит прекратить чтение из пополняющего сокета. P>2. Все то же самое, но можно сделать в одном потоке.
Спасибо!
Такой вопрос можно все сделать через один сокет которые принимает данные от клиента, даже если клиент будет одновременно создавать несколько коннектов?
Здравствуйте, MScanner, Вы писали:
MS>>>Как сделать порт маппер TCP на винсокс. MS>Такой вопрос можно все сделать через один сокет которые принимает данные от клиента, даже если клиент будет одновременно создавать несколько коннектов?
Не очень понял. Сначала создается принимающий сокет, который переводится в listen и с него делается accept для приема подключений. На каждое подключение accept вернет свой сокет-хендл для связи с клиентом. Если придет несколько клиентов, слушающий сокет остается как есть, он просто вернет несколько хендлов.
Подсказка: блокирующим режимом сокетов лучше не пользоваться — нет возможности прервать ожидание, а при ожидании на паре сокетов чтение-запись блокирующее чтение на одном из них блокирует весь поток. Намного лучше перевести сокеты в неблокирующий режим и использовать ожидание через select() — тут можно задать таймаут операции, и select() позволяет ожидать событий сразу на нескольких сокетах.
Подсказка2: select() можно прервать в любой момент. Для этого создается дополнительный UDP-сокет, привязанный к локалхосту, добавляется в мониторинг на "чтение" в select(), а когда требуется ожидание прервать достаточно послать один байт на адрес, к которому привязался UDP-сокет.
MS>>Такой вопрос можно все сделать через один сокет которые принимает данные от клиента, даже если клиент будет одновременно создавать несколько коннектов? P>Не очень понял. Сначала создается принимающий сокет, который переводится в listen и с него делается accept для приема подключений. На каждое подключение accept вернет свой сокет-хендл для связи с клиентом. Если придет несколько клиентов, слушающий сокет остается как есть, он просто вернет несколько хендлов. P>Подсказка: блокирующим режимом сокетов лучше не пользоваться — нет возможности прервать ожидание, а при ожидании на паре сокетов чтение-запись блокирующее чтение на одном из них блокирует весь поток. Намного лучше перевести сокеты в неблокирующий режим и использовать ожидание через select() — тут можно задать таймаут операции, и select() позволяет ожидать событий сразу на нескольких сокетах.
прервать легко — функцией shutdown. То есть простейший код потока будет блокирующе принимать с одного сокета и пересилать на другой. В случае ошибки — делаем shutdown на второй сокет и закрываем первый. На конекшен запускаем два потока — в обе стороны и все будет ок. Но с т.з. перфоманса конечно плохо. Такой код скорее академический.
Как много веселых ребят, и все делают велосипед...