Форум сайта python.su
Здраствуйте.
1. Если буфер пуст то функция send() отправляет что либо? Например:
buf=""
s.send(buf)
while 1:
try:
data_to_serv = conn.recv(1024)
print "TO SERVER: "+str(data_to_serv)+"\n"
sock_serv.send(data_to_serv)
data_to_serv = ''
data_from_serv = sock_serv.recv(1024)
print "FROM SERVER: "+str(data_from_serv)+"\n"
conn.send(data_from_serv)
data_from_serv = ''
except:
print "FAIL"
break
Отредактировано (Ноя. 8, 2010 01:21:01)
Офлайн
1. ничего не должно отправиться
2.(3). нужно слушать клиента и сервера параллельно. В отдельных потоках либо селектами, либо делать сокеты не блокирующими.
Офлайн
спасибо, попробую сделать в отдельных потоках.
Неполучается посмотрите код пожалуйста :
import socket
import threading
# Any socket app server
server_host = SERVER_IP
server_port = SERVER_PORT
# PROXY
proxy_host = '127.0.0.1'
proxy_port = 10000
class server_thread(threading.Thread):
def __init__(self, sock):
self.sock = sock
threading.Thread.__init__(self)
def run (self):
while 1:
try:
data = ''
data = self.sock.recv(8192)
if data != '':
print "FROM SERVER : "+str(data)+"\n"
self.sock.send(data)
except:
print "Connection with server is lose"
break
self.sock.close()
class client_thread(threading.Thread):
def __init__(self, sock):
self.sock = sock
threading.Thread.__init__(self)
def run (self):
while 1:
try:
data = ''
data = self.sock.recv(8192)
if data != '':
print "TO SERVER : "+str(data)+"\n"
self.sock.send(data)
except:
print "Connection with client is lose"
break
self.sock.close()
sock_rec = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_rec.bind((proxy_host, proxy_port))
sock_rec.listen(1)
conn, addr = sock_rec.accept()
print 'Connected by', addr
client_thread(conn).start()
sock_serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_serv.connect((server_host,server_port))
print "Connected to server"
server_thread(sock_serv).start()
Отредактировано (Ноя. 8, 2010 13:27:07)
Офлайн
Вообще-то обычно по сети общаются пакетами. Послал что-то - получил ответ. При этом обычно знают, какая длина ответа. Например, берут ее из заголовка.
В http все может быть очень сложнее - но тем не менее протокол четко оговорен.
У вас же какой-то мусор выходит.
Офлайн
Я пытаюсь сделать сокет прокси, откуда я буду знать длину пакетов ? Ведь через него может работать куча программ и у каждой свой протокол. Мне надо чтобы я мог приконектиться к скрипту любой программой, а скрипт реализовал бы приемо-отдачу трафика с сервером указанным в скрипте, вообщем прокси сервер простенький.
Спасибо что дали мне время подумать и решить свою проблему самому. Извеняюсь за тот бредовый код который я написал выше, что то я завтыкал и написал такой бред. Все исправил все заработало.
import socket
import threading
# Any socket server
server_host = 233.11.27.13
server_port = 9775
# PROXY
proxy_host = '127.0.0.1'
proxy_port = 20000
class server_thread(threading.Thread):
def __init__(self, server_sock, client_sock):
self.server_sock = server_sock
self.client_sock = client_sock
threading.Thread.__init__(self)
def run (self):
while 1:
try:
data = ''
data = self.server_sock.recv(8192)
if data != '':
print "FROM SERVER : "+str(data)+"\n"
print "RECEIVED FROM SERVER : "+str(self.client_sock.send(data))
except:
print "Connection with server is lose"
break
self.sock.close()
class client_thread(threading.Thread):
def __init__(self, server_sock, client_sock):
self.server_sock = server_sock
self.client_sock = client_sock
threading.Thread.__init__(self)
def run (self):
while 1:
try:
data = ''
data = self.client_sock.recv(8192)
if data != '':
print "TO SERVER : "+str(data)+"\n"
print "SENDED TO SERVER : "+str(self.server_sock.send(data))
except:
print "Connection with client is lose"
break
self.sock.close()
sock_rec = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_rec.bind((proxy_host, proxy_port))
sock_rec.listen(5)
conn, addr = sock_rec.accept()
print 'Connected by', addr
sock_serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_serv.connect((server_host,server_port))
print "Connected to server"
server_thread(sock_serv,conn).start()
client_thread(sock_serv,conn).start()
Отредактировано (Ноя. 8, 2010 19:37:04)
Офлайн
Задачка-то как раз для неблокирующей асинхры. Или вы все еще желаете с извращениями?
Офлайн
Я переписал полностью на неблокирующие сокеты стандартные, но проблема осталась (если я хочу вмешаться в траффик и шлю из кода свой собственный пакет то он не отсылается до того как на соответствующем сокете не сработает ресив ), мне посоветовали твистед я его немного посмотрел, пока я в шоке с этого фреймворка, принципы его для меня неясны и загадочны. Думаю как будет время заняться им понастойчивее может он мне поможет.
Офлайн
twisted - замечательная штука.
С простой до примитивизма структурой.
И тем не менее покажите, что вы накрутили с неблокирующими сокетами.
Офлайн
Питон из коробки имеет пару модулей в тему :)
http://docs.python.org/library/asyncore.html
http://docs.python.org/library/asynchat.html
Офлайн
Эти модули страшны как ночной кошмар.
Офлайн