2015-02-13 2 views
1

Я пытаюсь создать простой сервер, и продолжать получать следующее сообщение об ошибке в IDLE:Python Socket программирования - ошибка дескриптора файла Bad

File "C:\Python27\lib\socket.py", line 202, in accept 
sock, addr = self._sock.accept() 
    File "C:\Python27\lib\socket.py", line 170, in _dummy 
    raise error(EBADF, 'Bad file descriptor') 
error: [Errno 9] Bad file descriptor 

Это мой код. Я попытался понять, почему, и он имеет какое-то отношение к закрытию одного из сокетов, а затем пытается использовать его снова, но я действительно не понимаю, как я должен его исправить. Любая помощь приветствуется. :)

from socket import * 
serverSocket = socket(AF_INET, SOCK_STREAM) 
port=10101 
serverSocket.bind(('',port)) 
serverSocket.listen(5) 
while True: 
     print 'Ready to serve...' 
     connectionSocket, addr = serverSocket.accept() 
     try: 
       message = serverSocket.recv(1024) 
       filename = message.split()[1] 
       f = open(filename[1:]) 
       outputdata = f.read() 
       connectionSocket.send("HTTP/1.1 200 OK\r\n\n") 
       for i in range(0, len(outputdata)): 
         connectionSocket.send(outputdata[i]) 
       connectionSocket.close() 
     except IOError: 
       connectionSocket.send('HTTP/1.1 404 File not found\r\n\n') 
       connectionSocket.close() 
       serverSocket.close() 
serverSocket.close() 

ответ

0

Вы пытаетесь использовать переменные данных «message», не проверяя, является ли их пустым. Я думаю, что это может быть проблемой.

Попробуйте это:

from socket import * 
serverSocket = socket(AF_INET, SOCK_STREAM) 
port=10101 
serverSocket.bind(('localhost',port)) 
serverSocket.listen(5) 
while True: 
    print('Ready to server') 
    connectionSocket, addr = serverSocket.accept() 
    try: 
       message = connectionSocket.recv(1024) 
       if message != "": #Checking if empty 
        filename = message.split()[1] 
        f = open(filename[1:]) 
        outputdata = f.read() 
        connectionSocket.send("HTTP/1.1 200 OK\r\n\n") 
        for i in range(0, len(outputdata)): 
         connectionSocket.send(outputdata[i]) 
        connectionSocket.close() 
    except IOError: 
      connectionSocket.send('HTTP/1.1 404 File not found\r\n\n') 
      connectionSocket.close() 
      serverSocket.close() 
1

Пару вещей:

Как user27994550 положить в свой код, вы хотите использовать

message = connectionSocket.recv(1024) 

получать сообщения, не сокет сервера.

Другое дело, что оба ваших кодов пропустили это вы не хотите, чтобы позвонить

serverSocket.close() 

в вашей, за исключением функции, если вы не закрывая программу в целом. Если вы закроете серверный сокет, в следующий раз, когда вы позвоните

connectionSocket, addr = serverSocket.accept() 

вы не сможете принять другое соединение. Надеюсь это поможет!

Смежные вопросы