Уведомления

Группа в Telegram: @pythonsu

#1 Март 14, 2012 16:38:19

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

socket'ые ошибки

У меня несколько скриптов, каждый из них открывает соединение с одним и тем же сервером на разных портах
1 запущенный скрипт работает нормально
2 нормально
3 идет разрыв соединение и при попытке переподключится выдает эррор
при пререподключении я закрываю старое соединение(на всякий случай) и пытаюсь открыть новое на что получаю :

Exception in thread Thread-4:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
self.run()
File "my_pretty.py", line 570, in run
sock.send(size)
File "/usr/lib/python2.7/socket.py", line 170, in _dummy
raise error(EBADF, 'Bad file descriptor')
error: [Errno 9] Bad file descriptor
ОС: Ubuntu 11.04
Python: Python 2.7.1



Отредактировано (Март 14, 2012 16:39:42)

Офлайн

#2 Март 15, 2012 12:01:59

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

socket'ые ошибки

Как правильно организовывать реконект по сокету ?

# -*- coding: utf-8 -*-
import socket
import time
HOST = '10.10.20.10'
PORT = 1111
print "Установка соединения с сервером", HOST+':', PORT
try :
sock.connect((HOST, PORT))
except Exception, e:
print 'Соединение не установлено, причина:', e
sys.exit(0)
print 'Соединение установлено'
# запуск потоков обмена информацией
...
...
# когда происходит разрыв, в result попадает пустота ... result = '' и со временем получаю ошибку broken pipe
result = sock.recv(1024)
# пытаюсь реконектутся
if result = '':
sock.close()
time.sleep(1) # ну что б наверняка
try :
sock.connect((HOST, PORT))
except Exception, e:
print 'Соединение не установлено, причина:', e
sys.exit(0)
print 'Соединение установлено'
# и тут же [Errno 9] Bad file descriptor



Отредактировано (Март 15, 2012 12:17:13)

Офлайн

#3 Март 27, 2012 12:12:38

AlexeyB
Зарегистрирован: 2012-03-27
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

socket'ые ошибки

Я могу ошибаться, но сам реализовывал иначе. Необходимо

result = sock.recv(1024)
обернуть в try - except, потому что при разорванном соединении это обязательно приведет к исключению, нечто типа Broken Pipe. И мне кажется тут вернется объект None вместо пустой строки. Моя реализация (рабочий вариант):
def ConnectionsListener(self, conn_info):
	print '%s -- Called ConnectionsListener(%s, %s, %s)'%(time.time(), conn_info.sock, conn_info.addr, conn_info.OwnerName)
	while True:
		try:
			self.SendStrToClient('>', conn_info.sock)
			packet = conn_info.sock.recv(1024)
			for _tmp_counter in range(len(self.ListOfConnInfo)):
				if conn_info.sock == self.ListOfConnInfo[_tmp_counter].sock:
					conn_info.OwnerName = self.ListOfConnInfo[_tmp_counter].OwnerName
					break
			self.CommandDispatcher(packet, conn_info)
		except:
			print '%s -- Oops, %s closed by peer, killing it'%(time.time(), conn_info.sock)
			conn_info.sock.close()
			tmp_counter = 0
			for tmp_counter in range(len(self.ListOfConnInfo)):
				if conn_info.sock == self.ListOfConnInfo[tmp_counter].sock:
					del self.ListOfConnInfo[tmp_counter]
					break
				tmp_counter += 1
			break

Отредактировано AlexeyB (Март 27, 2012 12:44:40)

Офлайн

#4 Апрель 10, 2012 12:59:59

Axel2
Зарегистрирован: 2012-04-10
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

socket'ые ошибки

В сообщество Python вступил недавно так что…
В общем задача: написание простенького демона для серверной части игры. К серверу подключился через сокет, а вот передача данных ни в какую:

“import socket, string, sys
HOST=”localhost“
PORT=20000
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect((HOST, PORT))
s.send(”mission BEGIN“)
Traceback (most recent call last):
File ”C:\Python32\connect.py“, line 10, in <module>
s.send(”mission BEGIN“)
TypeError: ‘str’ does not support the buffer interface
>>> ”

Просьба пихнуть в нужную сторону, я дальше сам разберусь. Заранее спасибо. Кстати через send() не отправляются ни строковые ни числовые данные.

Офлайн

#5 Апрель 10, 2012 14:51:51

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

socket'ые ошибки

Через socket.send отправляются байты



Офлайн

#6 Апрель 10, 2012 16:54:34

Axel2
Зарегистрирован: 2012-04-10
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

socket'ые ошибки

Это я понял. Мне интересно, как оправить через сокет строковое значение.

Офлайн

#7 Апрель 10, 2012 17:48:16

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

socket'ые ошибки

Даже если слово “сериализация” вам незнакомо, ответ находится мгновенно. Вариациями на тему - Google: “send string over socket python”.



Офлайн

#8 Апрель 10, 2012 18:28:32

Axel2
Зарегистрирован: 2012-04-10
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

socket'ые ошибки

Спс, будем копать

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version