Обычно разрешается только одно использование адреса сокета протокол сетевой адрес порт python

Блог

socket.error: [Errno 10048] Обычно разрешается только одно использование каждого адреса сокета (протокол / сетевой адрес / порт)

#python #sockets #multiprocessing #md5

#python #сокеты #многопроцессорная обработка #md5

Вопрос:

я пытаюсь сделать расшифровку md5 сервер-клиент сервер отправляет, сколько у него ядер (cpu), и клиент нарезает его диапазон для многопроцессорной обработки (перебор), но сервер выдает мне «socket.error: [Errno 10048] Только одно использование каждого адреса сокета (протокол /обычно разрешается сетевой адрес / порт» ошибка есть какие-либо предложения?

 import socket RANGE=10000 d="7a2b33c672ce223b2aa5789171ddde2f" d=d.lower() HOMEADDRES='127.0.0.1' PORT=2345 ADDRESS=(HOMEADDRES,PORT) my_socket=socket.socket(socket.AF_INET ,socket.SOCK_STREAM) my_socket.connect((HOMEADDRES,PORT)) def main(): ranges="" my_socket.send(d) cores=int(my_socket.recv(1024)) borders=[0] for i in range(1,cores 1): borders.append(RANGE*i/cores) for i in range(len(borders)): ranges =str(borders[i]) "#" ranges=ranges[:-1] print ranges my_socket.send(ranges) print my_socket.recv(1024) my_socket.close() if __name__ == '__main__': main() 
 import socket import multiprocessing import hashlib IP_ADD='0.0.0.0' PORT=2345 ADDRESS = (IP_ADD,PORT) server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(ADDRESS) server_socket.listen(1) client_socket, address = server_socket.accept() print "connected" def decrypt(low,high,d): print "1" i=low while istr((i))) if m.hexdigest()==d: client_socket.send(i) client_socket.close() server_socket.close() i =1 def main(): d=client_socket.recv(1024) client_socket.send(str(multiprocessing.cpu_count())) borders=client_socket.recv(1024) borders=borders.split("#") for i in range(len(borders)-1): p=multiprocessing.Process(target=decrypt, args=(borders[i],borders[i 1],d)) p.start() if __name__ == '__main__': main() 

Комментарии:

1. Переместите код, который находится снаружи main() (создавая сокет сервера), в начало main . Вы не показываете, как main() вызывается на сервере, я предполагаю, что он похож на клиент.

Ответ №1:

Вы создаете свой серверный сокет в области модуля, поэтому, как только модуль импортируется, он создается и привязывается к (0.0.0.0, 2345).

Многопроцессорная обработка приведет к тому, что модуль будет (повторно) импортирован в создаваемый им новый процесс, поэтому этот процесс немедленно попытается создать тот же серверный сокет на порту 2345, а это невозможно.

Читайте также:  Java read file to list

Мое предложение заключается в том, чтобы либо не создавать свой серверный сокет в области модуля, но сделать это в main(), либо переместить многопроцессорный материал в его собственный модуль.

Комментарии:

1. что такое его собственный модуль »

2. нужно ли мне записать его в другой скрипт и импортировать его?

3. да, создайте новый модуль, например, для расшифровки. выполните поиск и переместите туда фактическую логику дешифрования. Тем не менее, также полезно не создавать сокет в области модуля.

4. что вы, мужчины? что такое создание сокета без модуля?

5. Это основные вопросы Python, понимаете ли вы, как работают модули в Python? Также и я, и cdarke выше уже сказали, что делать, переместить материал внутри main() или в их собственный модуль. Это позволит избежать создания сокета каждый раз, когда модуль загружается процессом, порожденным многопроцессорной обработкой.

Ответ №2:

Приведенная ниже идиома python решила это для меня

 if __name__ == "__main__": app = web.Application() web.run_app(app) 

Источник

Русские Блоги

Вышеупомянутая ошибка произошла, когда блоггер использовал модуль сокета для соединения между сервером и клиентом.

Ошибка следующая:

1: код server.py
# coding=utf-8 """ @author: jiajiknag Функция программы: сервер """ import socket # Создаем экземпляр сокета s = socket.socket() # Получить имя хоста host = socket.gethostname() # Определить номер порта port = 4321 # Адрес - это кортеж s.bind((host, port)) s.listen(5) while True: c, addr = s.accept() print("go connection from ", addr) c.send("Thank you for connecting") c.close() 
2: код client.py
# coding=utf-8 """ @author: jiajiknag Функция программы: клиент """ import socket s = socket.socket() host = socket.gethostname() port = 4321 s.connect((host, port)) print(s.recv(1024)) print(«Поздравляю, подключение прошло успешно . ») 
3. Результаты

решить

причина:

Когда мы завершаем состояние выполнения в рабочем окне в PyCharm, суть в том, что выполняемая программа python еще не завершена, поэтому откройте диспетчер задач Windows и завершите все процессы с именем python.

Источник

Как избавиться от ошибки использования одного адреса сокета (протокол/сетевой адрес/порт)?

Помогите избавиться от этой ошибки. Может она возникать из-за большого количества подключений в создаваемых потоках? В данном случае она возникает если я локально запускаю серверную часть.. В облачном сервере такого нет, все работает.. Есть клиентская часть которая отправляет каждые 2 секунды в тред серверной запрос, чекая подключен сервер или нет. Плюсом периодически отправляются запросы для основного функционала (минимальное количество. по сравнению с проверкой состояния подключения).. Такое ощущение что пропуская способность порта как-то запоролась, понятия не имею как поправить.. Может быть такое? Хэлп! Или я вообще неправильно многопоточность использую?

Читайте также:  Среда программирования c sharp

Ошибка стала возникать моментально при запуске серверной части, даже без запуска клиентской..

import datetime import os import re import socketserver from peewee import * import host import json class ThreadingTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): pass class EchoTCPHandler(socketserver.BaseRequestHandler): def handle(self): data = json.loads(self.request.recv(1024).decode()) . self.request.sendall(send_data.encode()) if __name__ == '__main__': with ThreadingTCPServer((host.hostl, 8888), EchoTCPHandler) as server: server.serve_forever()
Traceback (most recent call last): File "C:\Users\ASUS\PycharmProjects\server.py", line 178, in with ThreadingTCPServer((host.hostl, 8888), EchoTCPHandler) as server: File "C:\Python39\lib\socketserver.py", line 452, in __init__ self.server_bind() File "C:\Python39\lib\socketserver.py", line 466, in server_bind self.socket.bind(self.server_address) OSError: [WinError 10048] Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)

Источник

Python-сервер «Обычно разрешено только одно использование каждого адреса сокета»

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

from socket import * serverName = "localhost" serverPort = 4444 BUFFER_SIZE = 1024 s = socket(AF_INET, SOCK_STREAM) s.bind((serverName, serverPort)) s.listen(1) print "Server is ready to receive data. " while 1: newConnection, client = s.accept() msg = newConnection.recv(BUFFER_SIZE) print msg newConnection.send("hello world") newConnection.close() 

Иногда кажется, что это работает отлично (если я укажу моему браузеру «localhost: 4444», сервер напечатает HTTP-запрос GET, а веб-страница напечатает текст «hello world»). Но иногда я получаю следующее сообщение об ошибке при попытке запустить сервер после его закрытия в последние несколько минут:

Traceback (most recent call last): File "path\server.py", line 8, in s.bind((serverName, serverPort)) File "C:\Python27\lib\socket.py", line 224, in meth return getattr(self._sock,name)(*args) error: [Errno 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted 

Я программирую на Python с использованием Windows 7. Есть идеи, как это исправить?

Читайте также:  Документ с фреймами

7 ответов

Включите SO_REUSEADDR сокет перед вызовом bind (). Это позволяет немедленно повторно использовать адрес / порт вместо того, чтобы застревать в состоянии TIME_WAIT на несколько минут, ожидая прибытия поздних пакетов.

s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 

Если вы пытаетесь перезапустить сервер, не останавливая его в последний момент, он не будет работать. Если вы хотите остановить текущий момент, перейдите к

оболочка -> перезапустить оболочку.

Если вы уже закрыли оболочку без для остановки сервера перейдите к процессам python менеджер задач и конечная задача в фоновых процессорах. Это остановит последний момент вашего сервера.

В Windows вы можете попробовать эти шаги:

1. проверьте, какой процесс использует порт.

# 4444 is your port number netstat -ano|findstr 4444 

Вы получите что-то вроде этого:

# 19088 is the PID of the process TCP 0.0.0.0:4444 *:* 19088 

2. убить этот процесс

В статье, опубликованной @JohnKugelman, говорится, что даже после включения SO_REUSEADDR вы не можете использовать сокет для подключения к тому же удаленному концу, что и раньше:

SO_REUSADDR позволяет вам использовать порт, который застрял в TIME_WAIT, но вы все равно не можете использовать этот порт для установления соединения с последним местом, к которому он подключен.

Я вижу, что вы просто тестируете / играете. Однако, чтобы избежать этой ошибки, вам действительно нужно убедиться, что вы правильно разорвали соединение. Вы также можете связываться с таймингами tcp операционной системы: http : //www.linuxquestions.org/questions/linux-networking-3/decrease-time_wait-558399/

Для целей тестирования было бы также хорошо, если бы вы просто изменили serverPort в циклическом порядке, как вы думаете?

Это может быть потому, что вы не завершили серверный код и не попытались запустить его снова на другом cmd. Сервер не может быть размещен на том же номере порта, попробуйте убить предыдущий сервер.

Важно (особенно для Windows) закрыть сокет. В противном случае вы должны дождаться истечения времени ожидания после закрытия Python.

try: while 1: newConnection, client = s.accept() msg = newConnection.recv(BUFFER_SIZE) print msg newConnection.send("hello world") newConnection.close() finally: s.close() 

Я изменил свой номер порта на другой, и он работает.

if __name__ == '__main__': socketio.run(app, debug = True, use_reloader = False, port=1111) 

Источник

Оцените статью