Python Server socket.error:[Errno 92]协议不可用

时间:2016-05-29 19:42:42

标签: python

我想创建一个服务器,它以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

2 个答案:

答案 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,但没有此限制。