Найти - Пользователи
Полная версия: socket'ые ошибки
Начало » Network » socket'ые ошибки
1
sonniy
У меня несколько скриптов, каждый из них открывает соединение с одним и тем же сервером на разных портах
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
sonniy
Как правильно организовывать реконект по сокету ?
# -*- 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
AlexeyB
Я могу ошибаться, но сам реализовывал иначе. Необходимо
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
Axel2
В сообщество 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() не отправляются ни строковые ни числовые данные.
Андрей Светлов

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

Axel2
Это я понял. Мне интересно, как оправить через сокет строковое значение.
fata1ex
Даже если слово “сериализация” вам незнакомо, ответ находится мгновенно. Вариациями на тему - Google: “send string over socket python”.
Axel2
Спс, будем копать
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB