Python:如何生成此错误以及如何解决?

时间:2014-12-25 01:31:05

标签: python sockets

我正在开发一个基于服务器的简单猜测游戏。客户端的一部分是有一个ssl安全的管理客户端可以访问服务器来请求信息。我目前正在尝试将证书和内容添加到请求中,但是当运行(确实不完整的)文件时,我在以下代码的第65行得到“ValueError: file descriptor cannot be a negative integer (-1)”:

import select
import socket
import ssl
import random

def CreateGame():
    number = random.randrange(1,21,1)
    ##print(number)
    return number

def Greetings():
    member.send("Greetings\r\n".encode())

def Far():
    member.send("Far\r\n".encode())

def Close():
    member.send("Close\r\n".encode())

def Correct():
    member.send("Correct\r\n".encode())

def AdminGreetings():
    member.send("Admin-Greetings\r\n".encode())

def Who():
    responce = ""
    for connection in clientList:
        if connection != member:
            responce += str(clientList[connection])
    member.send((str(responce)).encode())
    member.close()
    reader_list.remove(member)
    del clientList[member]

def GameLogic(mNumber):
    if("Guess: " + str(mNumber) + "\r\n" == guess):
        Correct()
    elif(("Guess: " + str(mNumber-3) + "\r\n" == guess) or
         ("Guess: " + str(mNumber-2) + "\r\n" == guess) or
         ("Guess: " + str(mNumber-1) + "\r\n" == guess) or
         ("Guess: " + str(mNumber+1) + "\r\n" == guess) or
         ("Guess: " + str(mNumber+2) + "\r\n" == guess) or
         ("Guess: " + str(mNumber+3) + "\r\n" == guess) ):
        Close()
    else:
        Far()



#client socket
s1 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s1.bind(('',4000))  
s1.listen(5)
#admin socket
s2 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s2.bind(('',4001))  
s2.listen(5)

reader_list = [s1,s2]
clientList = {}
mNumber = CreateGame()

while True:
    (read,write,error) = select.select(reader_list,[],[])

    for member in read:
        if member == s1:
            (read,write) = s1.accept()
            reader_list.append(read)
        elif member == s2:
            (read,write) = s2.accept()
            reader_list.append(read)
            sslSocket = ssl.wrap_socket(member,
                                    keyfile="5cc515_server.key",
                                    certfile="5cc515_server.crt",
                                    server_side = True,
                                    cert_reqs = ssl.CERT_REQUIRED,
                                    ca_certs="5cc515_root_ca.crt")
        else:
            try:
                message = member.recv(4092).decode()
                sockAddr = member.getsockname()
                if(message == "Hello\r\n"):
                    addr = str(sockAddr[0]) + " " + str(sockAddr[1]) + "\r\n"
                    clientList[member] = addr
                    if (sockAddr[1] == 4001):#is using port 4000
                        try:
                            ssl_s = ssl.wrap_socket(member,
                                                    keyfile="5cc515_server.key",
                                                    certfile="5cc515_server.crt",
                                                    server_side = True,
                                                    cert_reqs = ssl.CERT_REQUIRED,
                                                    ca_certs="5cc515_root_ca.crt")
                            ##handshake stuff
                            AdminGreetings()
                        except:
                            break
                    else:
                        Greetings()
                elif(message == "Who\r\n"):
                    ##handshake stuff
                    Who()
                else:
                    ##print("try and assign guess")
                    guess = message
                    ##print("game logic")
                    GameLogic(mNumber)
            except:
                print("recv failed")
                member.close()
                reader_list.remove(member)
                del clientList[member]
                break

据我所知,如果没有crt和key这个cant真的被调试了,但是因为没有任何东西正在改变reader_list []我不明白为什么它从2变为-ve ...

无论如何这里是另一部分(管理客户端)

import socket
import select
import ssl

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
handshake = False
# send Hello
try:
    while handshake == False:
        print("create ssl socket")
        sslSocket = ssl.wrap_socket(s,
                                    keyfile="100297626.key",
                                    certfile="100297626.crt",
                                    server_side = False,
                                    ca_certs="5cc515_root_ca.crt")
        print("connect")
        sslSocket.connect(("127.0.0.1", 4001))
        print("send hello")
        sslSocket.write("Hello\r\n".encode())
    print("rec hello")
    sslSocket.recv(80).decode()
    sslSocket.send("Who\r\n".encode())
    print(sslSocket.recv(4092).decode())
except:
    print("Server Unavailable")
s.close()

提前致谢!

1 个答案:

答案 0 :(得分:0)

第65行是:

    (read,write,error) = select.select(reader_list,[],[])

必须推断出错误来自于在其read_list中将fd为-1的套接字传递给select.select。请再次运行您的代码,但请检查:

assert all(s.fileno() != -1 for s in reader_list)