Найти - Пользователи
Полная версия: Ошибка OSError: [WinError 10048] Обычно разрешается одно использование адреса сокета (п ротокол/сетевой адрес/порт)
Начало » Python для новичков » Ошибка OSError: [WinError 10048] Обычно разрешается одно использование адреса сокета (п ротокол/сетевой адрес/порт)
1 2
admiral
Здравствуйте.
При запуски нескольких скриптов (от 7 и больше) - через какое-то время работы выскакивает вот такая ошибка:
Traceback (most recent call last):
File “C:\Python33\lib\urllib\request.py”, line 1248, in do_open
h.request(req.get_method(), req.selector, req.data, headers)
File “C:\Python33\lib\http\client.py”, line 1061, in request
self._send_request(method, url, body, headers)
File “C:\Python33\lib\http\client.py”, line 1099, in _send_request
self.endheaders(body)
File “C:\Python33\lib\http\client.py”, line 1057, in endheaders
self._send_output(message_body)
File “C:\Python33\lib\http\client.py”, line 902, in _send_output
self.send(msg)
File “C:\Python33\lib\http\client.py”, line 840, in send
self.connect()
File “C:\Python33\lib\http\client.py”, line 818, in connect
self.timeout, self.source_address)
File “C:\Python33\lib\socket.py”, line 435, in create_connection
raise err
File “C:\Python33\lib\socket.py”, line 426, in create_connection
sock.connect(sa)
OSError: (WinError 10048) Обычно разрешается одно использование адреса сокета (п
ротокол/сетевой адрес/порт)
Вроде везде все возможные проблемные места запихнул в TRY.
Может это в операционке где параметр подправить нужно? У меня WinXP sp3
JOHN_16
admiral
как вы думаете, что произойдет когда 7 веб серверов захотят использовать localhost:80 ? это тонкий намек на вероятную проблему
admiral
Это не 7 веб-серверов, а 7 веб-клиентов скорее.
Привожу пример:
...
    ...
    try:
        res_url += "?" + urllib.parse.urlencode({'key': key, 'action': 'get', 'id': id})
        rs = urllib.request.urlopen(res_url)
        res = rs.read()
        res = res.decode()
    except:
        return(False,"SITE_NOT_WORK")
    rs.close() #закрываем соединение
   ... 
Я этот кусок кручу в цикле раз в 1сек, пока не выполнится нужное условие.
И таких скриптов 7 штук, которые крутят этот кусок.
Соединение я закрываю каждый раз. Может я его неправильно закрываю?
JOHN_16
admiral
rs.close() не будет срабатывать когда сработает return, вам вероятнее всего в этом случае нужна конструкция try except finally - прочтите доки что бы уточнить
admiral
Переделал на такой вариант.
    try:
        res_url += "?" + urllib.parse.urlencode({'key': key, 'action': 'get', 'id': id})
        rs = urllib.request.urlopen(res_url)
        res = rs.read()
        res = res.decode()
    except:
        print ("Ошибка.")
        try:
            rs.close() #закрываем соединение
        except:
            print ("Ошибка. Не могу закрыть соединение rs")
        return(False,"SITE_NOT_WORK")
    try:
        rs.close() #закрываем соединение
    except:
        print ("Ошибка. Не могу закрыть соединение rs")
Все равно выскакивает та же самая ошибка.
Такое ощущение, что не так закрываю соединение.
Порылся в интернете - нашел вот эту статью.
Там говорится:
Появится сообщение об ошибке элемента управления Winsock, после вызова метода Connect, если один и тот же локальный порт использовался в течение последних четырех минут.
Примерно как раз через минуты 4 все и начинается.
Из статьи ничего не понял как избавится от этого.
JOHN_16
начал внимательнее смотреть на код и обнаружил что urllib.request - вы наверное ошиблись или используете другую библиотеку urlib?
я использовал urllib.urlopen(url).read() сделал 2000 асинхронных запросов, но повторить ошибку не получилось - диапазон портов для исходящих сообщений большой, перекрыть его это надо целенаправленно стараться..а 7 в вашем случае - пустяк для ОС. Попробуйте либо мой вариант, либо запустить ваш же код на другой ОС Виндовс - может ваша настроена кем то по особому
sanodin
Я такую ошибку у себя гашу закрытием в процессах нескольких pythonw.exe потому как в процессе экспериментов , и многократных запусках скрипта, в процессах висят незакрытые pythonw.exe, даже если программа уже завершена
вот они то и не дают пользовать “разрешается одно использование адреса сокета”
но это с одним и тем же скриптом, а у вас 7 сразу
просто батничком убиваю, TASKKILL /F /IM pythonw.exe
…а если не закрывать соединения?
admiral
JOHN_16
начал внимательнее смотреть на код и обнаружил что urllib.request - вы наверное ошиблись или используете другую библиотеку urlib?я использовал urllib.urlopen(url).read() сделал 2000 асинхронных запросов, но повторить ошибку не получилось - диапазон портов для исходящих сообщений большой, перекрыть его это надо целенаправленно стараться..а 7 в вашем случае - пустяк для ОС. Попробуйте либо мой вариант, либо запустить ваш же код на другой ОС Виндовс - может ваша настроена кем то по особому
Не работает вот так:
rs = urllib.urlopen(res_url)
У меня python 3.3, в документации у urllib нет метода urlopen. все закинуто в urllib.request.
Посмотрел доку на 2.7 - там в urllib есть urlopen().
Винду настраивал сам, сетевые настройки по-умолчанию.
sanodin
Я такую ошибку у себя гашу закрытием в процессах нескольких pythonw.exe потому как в процессе экспериментов , и многократных запусках скрипта, в процессах висят незакрытые pythonw.exe, даже если программа уже завершенавот они то и не дают пользовать “разрешается одно использование адреса сокета”но это с одним и тем же скриптом, а у вас 7 сразупросто батничком убиваю, TASKKILL /F /IM pythonw.exe…а если не закрывать соединения?
У меня только py.exe и python.exe и все. Мне не нужно их убивать, мне нужно добиться, что бы они работали как можно дольше без вылетов.
Меня вполне устроит вариант, что если не удалось установить соединение - что бы скрипт отработал это исключение, и, к примеру, через 5 секунд попытался еще раз. Но что бы не вываливался с ошибкой и не завершал работу. Везде же TRY стоит - а все равно вылетает.
ЗЫ. Добавил в подпись свою конфигу.
sanodin
try , ставьте pass, тогда будет продолжать пока не будет удачного соединения, и уже если соединение удачное и отработало тогда закрыть за ненадобностью, а не стараться его закрыть если его и создать то не удалось rs.close()
    try:
        res_url += "?" + urllib.parse.urlencode({'key': key, 'action': 'get', 'id': id})
        rs = urllib.request.urlopen(res_url)
        res = rs.read()
        res = res.decode()
        rs.close()
    except:
        print ("Ошибка.")
        pass
я и не говорю убивать процессы которые вы только запустили, я говорил о тех которые остаются висеть когда вы уже завершили работу всех программ, вы же сначала их запускаете, они отработали и вы их завершили, закрыли, а порты остаются занятыми процессами python.exe - это проверенно, такая ошибка возникает если скрипт запускался не один раз, у вас же и соединения закрываются и программа вылетает через определенное время, значит аналогии вроде нет с моими ошибками…забудьте
у вас же чуть по другому, вы сами намеренно запускаете несколько программ которые используют сокеты
Если это клиенты, то может их стоит в одну программу впихнуть, если возможно конечно
И если расскажите чего вы добиваетесь и что задумали, может и логика будет нужна другая
bw
Сервер ваш? На нём точно выполняется `accept` (socket)? Возможно сервер не успевает море новых соединений обрабатывать (речь о большом промежутке между вызовами `accept`), тогда может помочь параметр в `listen` или переделывание сервера. Попробуйте другой клиент, например telnet (несколько экземпляров). Попробуйте другой сервер.
Вы можете выложить код сервера и клиента урезанные, но достаточные для воспроизведения ошибки? Не куски кода (с точечками), а рабочий код.

..bw
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB