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

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

Приветстсвую! Захотел написать сервер, который способен принимать большое количество соединений, кажое в отдельном процессе(для примера). Вот код из файла server_1.py:

# создание сокета, таймауты и обработка ошибок # сервер import socket from multiprocessing import Process def data_handler(connection): print('Starting handle') with connection: while True: try: data = connection.recv(1024) except socket.timeout: print("close connection by timeout") break if not data: break print(data.decode("utf8")) with socket.socket() as sock: sock.bind(("127.0.0.1", 10001)) sock.listen() print('socket забайден') while True: conn, addr = sock.accept() conn.settimeout(5) # timeout := None|0|gt 0 p = Process(target=data_handler, args=(conn,)) p.start() p.join() 

Клиент — работа в консоли: import socket sock = socket.create_connection((‘127.0.0.1’, 10001))

В итоге вылетает исключение в программе server_1.py вида:

Traceback (most recent call last): File "", line 1, in File "E:\Anaconda3\lib\multiprocessing\spawn.py", line 105, in spawn_main exitcode = _main(fd) File "E:\Anaconda3\lib\multiprocessing\spawn.py", line 114, in _main prepare(preparation_data) File "E:\Anaconda3\lib\multiprocessing\spawn.py", line 225, in prepare _fixup_main_from_path(data['init_main_from_path']) File "E:\Anaconda3\lib\multiprocessing\spawn.py", line 277, in _fixup_main_from_path run_name="__mp_main__") File "E:\Anaconda3\lib\runpy.py", line 263, in run_path pkg_name=pkg_name, script_name=fname) File "E:\Anaconda3\lib\runpy.py", line 96, in _run_module_code mod_name, mod_spec, pkg_name, script_name) File "E:\Anaconda3\lib\runpy.py", line 85, in _run_code exec(code, run_globals) File "D:\Python_code\server_1.py", line 23, in sock.bind(("127.0.0.1", 10001)) OSError: [WinError 10048] Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт) 

Я прочитал, пишут, что я не могу два раза bind’нуть один и тот же адрес. Но ведь разве я не один раз его bind’ю при запуске server_1.py? Почему socket.create_connection((«127.0.0.1», 10001)) тоже bind’ит?

Дело в том, что в server_2.py всё работает нормально и исключение не вылетает:

import socket with socket.socket() as sock: sock.bind(("127.0.0.1", 10001)) sock.listen() while True: conn, addr = sock.accept() print("connected client:", addr) # процесс или поток для обработки соединения with conn: while True: data = conn.recv(1024) if not data: break print(data.decode("utf8")) 

Но почему тут не вылетает OSError: [WinError 10048]? Дайте пожалуйста чёткую разницу между этими серверами. И подскажите, что не так в первом случае?

Источник

Python Server Client program error: «OSError: [WinError 10048]»

So I’m studying Python from the book Fundamentals of Python by Kenneth Lambert and I’m having trouble with an error from one of the programs in the book. Here in chapter 10 talks about Clients and Servers. My professor asked us to key those programs in Python to see how they work. The first programs worked perfectly, but in a program I’m getting an error which seems to be a Windows error instead of a Python one. This is the program in page 339:

from socket import * from time import ctime from threading import Thread class ClientHandler(Thread): """Handles a client request.""" def __init__(self, client): Thread.__init__(self) self._client = client def run(self): self._client.send(bytes(ctime() + '\nHave a nice day!' , 'ascii')) self._client.close() HOST = "localhost" PORT = 5000 BUFSIZE = 1024 ADDRESS = (HOST, PORT) server = socket(AF_INET, SOCK_STREAM) server.bind(ADDRESS) server.listen(5) # The server now just waits for connections from clients # and hands sockets off to client handlers while True: print('Waiting for connection') client, address = server.accept() print('. connected from:', address) handler = ClientHandler(client) handler.start() 

When I run this program, it displays the «Waiting for connection» message in the Shell. However, when I try to connect to the program using the Command Prompt, it displays the following error:

C:\Python33>python multi-client-server.py Traceback (most recent call last): File "multi-client-server.py", line 30, in server.bind(ADDRESS) OSError: [WinError 10048] Only one usage of each socket address (protocol/networ k address/port) is normally permitted 

We haven’t studied this in class a lot. So I’m just wondering why this happens and how to fix it. Thanks!

Читайте также:  Компьютерная сеть интернета способы подключения

1 Answer 1

We haven’t studied this in class a lot. So I’m just wondering why this happens and how to fix it.

enter image description here

Why: You are trying to run the same code snippet from two different CMD on a Windows OS. So, when you initially execute the code snippet, the server starts listening on the port number 5000 , then when you execute the same code snippet from the second CMD wndow it conflicts with the socket that is already being used by the first one. I tested this on Windows 8.

How to fix: To fix this issue, you have to simply use a different port number when you execute the code snippet for the second time, so that the socket(IP+port) doesn’t conflicts with the previous one. Simply edit your code and put PORT = 15200 and save this file with a different name.(I have provided the code below too.) Now try executing the first code snippet file from a CMD windows and then execute the second code snippet file that you created right now from the second CMD window. The issue will be solved!

from socket import * from time import ctime from threading import Thread class ClientHandler(Thread): """Handles a client request.""" def __init__(self, client): Thread.__init__(self) self._client = client def run(self): self._client.send(bytes(ctime() + '\nHave a nice day!' , 'ascii')) self._client.close() HOST = "localhost" PORT = 15200 # Port number was changed here BUFSIZE = 1024 ADDRESS = (HOST, PORT) server = socket(AF_INET, SOCK_STREAM) server.bind(ADDRESS) server.listen(5) # The server now just waits for connections from clients # and hands sockets off to client handlers while True: print('Waiting for connection') client, address = server.accept() print('. connected from:', address) handler = ClientHandler(client) handler.start() 

If you prefer then have a look here for the basic client-server issues.

Читайте также:  Компьютерная сеть это множество компьютеров внутри одного здания

Источник

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

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

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

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.

Источник

Блог

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, а это невозможно.

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

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

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

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

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

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

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

Ответ №2:

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

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

Источник

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