我想创建一个服务器,它以String的形式从客户端获取命令,然后发送一个String(或一个字符串列表)。 第一次,我运行服务器和客户端,它运行得很好,但在服务器将String发送到客户端后,服务器崩溃并显示消息:
socket.error: [Errno 92] Protocol not available
这是服务器:
import socket
import errno
def Main():
host = '192.168.178.30'
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
s.bind((host, port))
s.listen(1)
while True:
c, addr = s.accept()
c.setblocking(0)
print "Connection from: " + str(addr)
command = c.recv(1024)
if command == 'GIVETEXT':
c.send('test')
try:
c.close()
s.setsockopt(socket.AF_INET, socket.SOCK_STREAM, 1)
except socket.error as e:
if e.errno != errno.ECONNRESET:
raise
pass
if __name__ == '__main__':
Main()
以下是客户部分:
import socket
class Client(object):
def __init__(self, *args):
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def sent(self, host, port):
self.s.connect((host, port))
self.s.send('GIVETEXT')#sends command
self.Text = self.s.recv(1024)
print self.Text
self.s.close
return self.Text
答案 0 :(得分:1)
在服务器代码中,您是否可以评论(或删除)以下行:
s.setsockopt(socket.AF_INET, socket.SOCK_STREAM, 1)
setsockopt操作是定义套接字的选项。级别应为SOL_SOCKET,并且可以在setsockopt手册页中找到不同的选项: http://linux.die.net/man/3/setsockopt
一个例子是:
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
答案 1 :(得分:0)
在我的情况下,它最终成为eventlet
库,它只与Linux内核版本> = 3.9兼容。 (如此文件的源代码中所示:https://github.com/eventlet/eventlet/blob/f9a3074a3b75f17f76cc04a693dc48a367b99861/eventlet/convenience.py试图运行sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
)。
在我的情况下,我使用Flask-SocketIO也可以切换到gevent
,但没有此限制。