Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Python для новичков
  • » Ошибка OSError: [WinError 10048] Обычно разрешается одно использование адреса сокета (п ротокол/сетевой адрес/порт) [RSS Feed]

#1 Дек. 23, 2013 12:31:19

admiral
Зарегистрирован: 2013-12-23
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка OSError: [WinError 10048] Обычно разрешается одно использование адреса сокета (п ротокол/сетевой адрес/порт)

Здравствуйте.
При запуски нескольких скриптов (от 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



Win7 + Python3.3 + PyScripter

Отредактировано admiral (Дек. 23, 2013 12:33:14)

Офлайн

#2 Дек. 24, 2013 02:46:50

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Ошибка OSError: [WinError 10048] Обычно разрешается одно использование адреса сокета (п ротокол/сетевой адрес/порт)

admiral
как вы думаете, что произойдет когда 7 веб серверов захотят использовать localhost:80 ? это тонкий намек на вероятную проблему



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Дек. 24, 2013 08:24:54

admiral
Зарегистрирован: 2013-12-23
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка OSError: [WinError 10048] Обычно разрешается одно использование адреса сокета (п ротокол/сетевой адрес/порт)

Это не 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 штук, которые крутят этот кусок.
Соединение я закрываю каждый раз. Может я его неправильно закрываю?



Win7 + Python3.3 + PyScripter

Отредактировано admiral (Дек. 24, 2013 08:25:42)

Офлайн

#4 Дек. 24, 2013 12:41:33

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Ошибка OSError: [WinError 10048] Обычно разрешается одно использование адреса сокета (п ротокол/сетевой адрес/порт)

admiral
rs.close() не будет срабатывать когда сработает return, вам вероятнее всего в этом случае нужна конструкция try except finally - прочтите доки что бы уточнить



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Дек. 24, 2013 19:47:04

admiral
Зарегистрирован: 2013-12-23
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка OSError: [WinError 10048] Обычно разрешается одно использование адреса сокета (п ротокол/сетевой адрес/порт)

Переделал на такой вариант.

    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 все и начинается.
Из статьи ничего не понял как избавится от этого.



Win7 + Python3.3 + PyScripter

Офлайн

#6 Дек. 24, 2013 23:46:58

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Ошибка OSError: [WinError 10048] Обычно разрешается одно использование адреса сокета (п ротокол/сетевой адрес/порт)

начал внимательнее смотреть на код и обнаружил что urllib.request - вы наверное ошиблись или используете другую библиотеку urlib?
я использовал urllib.urlopen(url).read() сделал 2000 асинхронных запросов, но повторить ошибку не получилось - диапазон портов для исходящих сообщений большой, перекрыть его это надо целенаправленно стараться..а 7 в вашем случае - пустяк для ОС. Попробуйте либо мой вариант, либо запустить ваш же код на другой ОС Виндовс - может ваша настроена кем то по особому



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#7 Дек. 25, 2013 06:59:04

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Ошибка OSError: [WinError 10048] Обычно разрешается одно использование адреса сокета (п ротокол/сетевой адрес/порт)

Я такую ошибку у себя гашу закрытием в процессах нескольких pythonw.exe потому как в процессе экспериментов , и многократных запусках скрипта, в процессах висят незакрытые pythonw.exe, даже если программа уже завершена
вот они то и не дают пользовать “разрешается одно использование адреса сокета”
но это с одним и тем же скриптом, а у вас 7 сразу
просто батничком убиваю, TASKKILL /F /IM pythonw.exe
…а если не закрывать соединения?

Отредактировано sanodin (Дек. 25, 2013 09:32:11)

Офлайн

#8 Дек. 25, 2013 14:22:59

admiral
Зарегистрирован: 2013-12-23
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка OSError: [WinError 10048] Обычно разрешается одно использование адреса сокета (п ротокол/сетевой адрес/порт)

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 стоит - а все равно вылетает.
ЗЫ. Добавил в подпись свою конфигу.



Win7 + Python3.3 + PyScripter

Отредактировано admiral (Дек. 25, 2013 14:27:51)

Офлайн

#9 Дек. 25, 2013 14:57:24

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Ошибка OSError: [WinError 10048] Обычно разрешается одно использование адреса сокета (п ротокол/сетевой адрес/порт)

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 - это проверенно, такая ошибка возникает если скрипт запускался не один раз, у вас же и соединения закрываются и программа вылетает через определенное время, значит аналогии вроде нет с моими ошибками…забудьте
у вас же чуть по другому, вы сами намеренно запускаете несколько программ которые используют сокеты
Если это клиенты, то может их стоит в одну программу впихнуть, если возможно конечно
И если расскажите чего вы добиваетесь и что задумали, может и логика будет нужна другая

Отредактировано sanodin (Дек. 25, 2013 17:33:38)

Офлайн

#10 Дек. 26, 2013 02:45:41

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Ошибка OSError: [WinError 10048] Обычно разрешается одно использование адреса сокета (п ротокол/сетевой адрес/порт)

Сервер ваш? На нём точно выполняется `accept` (socket)? Возможно сервер не успевает море новых соединений обрабатывать (речь о большом промежутке между вызовами `accept`), тогда может помочь параметр в `listen` или переделывание сервера. Попробуйте другой клиент, например telnet (несколько экземпляров). Попробуйте другой сервер.
Вы можете выложить код сервера и клиента урезанные, но достаточные для воспроизведения ошибки? Не куски кода (с точечками), а рабочий код.

..bw



Офлайн

  • Начало
  • » Python для новичков
  • » Ошибка OSError: [WinError 10048] Обычно разрешается одно использование адреса сокета (п ротокол/сетевой адрес/порт) [RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version