Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 8, 2010 01:19:50

hzkto1
От:
Зарегистрирован: 2010-11-08
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы по сокетам

Здраствуйте.

1. Если буфер пуст то функция send() отправляет что либо? Например:

buf=""
s.send(buf)
Будет ли что либо отправлено ?

2. Я делаю простой сокет прокси, ну и исхожу из первого логичного решения которое пришло мне на ум:
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
conn - висит на порту и слушает и принимает соединение, sock_serv коннектится непосредственно к удаленному серверу.

3. Проблема в том что после нескольких пакетов общение сервера и клиента прекращяется, такое ощушение что на сервер что то неотправилось, либо отправилось что то лишнее и сервер висит в режиме ожидания адекватной рекции клиента.

PS прокси тестировал на онлайн игре
PS2 до этого момента на питоне не программировал так что если что не так пинайте



Отредактировано (Ноя. 8, 2010 01:21:01)

Офлайн

#2 Ноя. 8, 2010 04:16:52

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Вопросы по сокетам

1. ничего не должно отправиться

2.(3). нужно слушать клиента и сервера параллельно. В отдельных потоках либо селектами, либо делать сокеты не блокирующими.

Офлайн

#3 Ноя. 8, 2010 10:17:15

hzkto1
От:
Зарегистрирован: 2010-11-08
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы по сокетам

спасибо, попробую сделать в отдельных потоках.

Неполучается посмотрите код пожалуйста :

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)

Офлайн

#4 Ноя. 8, 2010 14:16:02

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Вопросы по сокетам

Вообще-то обычно по сети общаются пакетами. Послал что-то - получил ответ. При этом обычно знают, какая длина ответа. Например, берут ее из заголовка.
В http все может быть очень сложнее - но тем не менее протокол четко оговорен.
У вас же какой-то мусор выходит.



Офлайн

#5 Ноя. 8, 2010 14:20:39

hzkto1
От:
Зарегистрирован: 2010-11-08
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы по сокетам

Я пытаюсь сделать сокет прокси, откуда я буду знать длину пакетов ? Ведь через него может работать куча программ и у каждой свой протокол. Мне надо чтобы я мог приконектиться к скрипту любой программой, а скрипт реализовал бы приемо-отдачу трафика с сервером указанным в скрипте, вообщем прокси сервер простенький.

Спасибо что дали мне время подумать и решить свою проблему самому. Извеняюсь за тот бредовый код который я написал выше, что то я завтыкал и написал такой бред. Все исправил все заработало.

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)

Офлайн

#6 Ноя. 10, 2010 11:08:18

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Вопросы по сокетам

Задачка-то как раз для неблокирующей асинхры. Или вы все еще желаете с извращениями?



Офлайн

#7 Ноя. 16, 2010 13:34:09

hzkto1
От:
Зарегистрирован: 2010-11-08
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы по сокетам

Я переписал полностью на неблокирующие сокеты стандартные, но проблема осталась (если я хочу вмешаться в траффик и шлю из кода свой собственный пакет то он не отсылается до того как на соответствующем сокете не сработает ресив ), мне посоветовали твистед я его немного посмотрел, пока я в шоке с этого фреймворка, принципы его для меня неясны и загадочны. Думаю как будет время заняться им понастойчивее может он мне поможет.



Офлайн

#8 Ноя. 16, 2010 15:35:18

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Вопросы по сокетам

twisted - замечательная штука.
С простой до примитивизма структурой.
И тем не менее покажите, что вы накрутили с неблокирующими сокетами.



Офлайн

#9 Ноя. 17, 2010 05:17:04

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы по сокетам

Питон из коробки имеет пару модулей в тему :)
http://docs.python.org/library/asyncore.html
http://docs.python.org/library/asynchat.html



Офлайн

#10 Ноя. 17, 2010 06:32:16

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Вопросы по сокетам

Эти модули страшны как ночной кошмар.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version