Хобрук: Ваш путь к мастерству в программировании

Программирование сокетов Python — ошибка неверного файлового дескриптора

Я пытаюсь создать простой сервер и продолжаю получать следующую ошибку в IDLE:

  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()
13.02.2015

  • Произошла ревизия сокета, теперь все в байтах. Убедитесь, что имя файла не нужно преобразовывать в строку. 28.09.2020

Ответы:


1

Несколько вещей:

Как пользователь 27994550 указал в своем коде, вы хотите использовать

 message = connectionSocket.recv(1024)

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

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

serverSocket.close()

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

connectionSocket, addr = serverSocket.accept()

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

13.02.2015

2

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

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

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()
13.02.2015
Новые материалы

Создание успешной организации по науке о данных
"Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

Технологии и проблемы будущей работы
Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

Игорь Минар из Google приедет на #ReactiveConf2017
Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

Я собираюсь научить вас Python шаг за шагом
Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

React on Rails
Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

Что такое гибкие методологии разработки программного обеспечения
Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...