LINUX.ORG.RU

неблокируемые сокеты - зделать тунель


0

0

собсвеноо говоря задача:
есть некотороя программа ну для примера rdp виндовый. машина
на которой эта самая программа запушена может быть за натом,
за проксей или еше за чемнибуть, кароче реального ип у нее нету,
но доступ в инет на машине есть, доступа к фаерволу в данной локалке
будем шитать нету. моя задача написать приграмму котороя,
запускается
цепляется к порту машины (из примера rdp)
цепляется к порту удаленного сервера (моего)
на сервере весит какой-то демон, который отлавливает такие
коннекты, на соотвецтвенно при обнаружении очередного весь трафик
который пришол на порт от клиента отправить на порт который он открыл
(к этому порту соотвецвенно зацепился админ), и то что пришло от админа,
отправить по каналу к клиенту а клиент соотвецвенно в место назначения
те такая схема:
{client rdp:3389 <--tcp--> mytun}----{nat}--->{8888:mydaemon myserver mydaemon:8181} <---> {admin}

написал программу на питоне:
import socket

HOST="localhost"
PORT=8083

rhost="10.2.1.2"
rport=22

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))

s.listen(1)
conn, addr = s.accept()
conn.setblocking(0)

p = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

p.connect((rhost, rport))
p.setblocking(0)
#p.send(Hello, worldБ)
#data = s.recv(1024)
#s.close()


print addr
try:
while 1:
while 1:
try:
data = p.recv(1024)
print "server:%s"%data
if data == '': break
conn.send(data)
except: break


while 1:
try:
data = conn.recv(1024)
print "client:%s"%data
if data == '': break
p.send(data)
except: break
finally:
conn.close()
собсвенно говоря работает, но грузит систему, ибо сокет в бесконечном
цикле постоянно проверят. вопрос как зделать правильно?

anonymous

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.