Windows socket error обычно разрешается только одно использование адреса сокета

Реализация DI в PHP

Jason-Webb 13.05.2025

Когда я начинал писать свой первый крупный PHP-проект, моя архитектура напоминала запутаный клубок спагетти. Классы создавали другие классы внутри себя, зависимости жостко прописывались в коде, а о. . .

Обработка изображений в реальном времени на C# с OpenCV

stackOverflow 13.05.2025

Объединение библиотеки компьютерного зрения OpenCV с современным языком программирования C# создаёт симбиоз, который открывает доступ к впечатляющему набору возможностей. Ключевое преимущество этого. . .

POCO, ACE, Loki и другие продвинутые C++ библиотеки

NullReferenced 13.05.2025

В C++ разработки существует такое обилие библиотек, что порой кажется, будто ты заблудился в дремучем лесу. И среди этого многообразия POCO (Portable Components) – как маяк для тех, кто ищет. . .

Паттерны проектирования GoF на C#

UnmanagedCoder 13.05.2025

Вы наверняка сталкивались с ситуациями, когда код разрастается до неприличных размеров, а его поддержка становится настоящим испытанием. Именно в такие моменты на помощь приходят паттерны Gang of. . .

Создаем CLI приложение на Python с Prompt Toolkit

py-thonny 13.05.2025

Современные командные интерфейсы давно перестали быть черно-белыми текстовыми программами, которые многие помнят по старым операционным системам. CLI сегодня – это мощные, интуитивные и даже. . .

Конвейеры ETL с Apache Airflow и Python

AI_Generated 13.05.2025

ETL-конвейеры – это набор процессов, отвечающих за извлечение данных из различных источников (Extract), их преобразование в нужный формат (Transform) и загрузку в целевое хранилище (Load). . . .

Выполнение асинхронных задач в Python с asyncio

py-thonny 12.05.2025

Современный мир программирования похож на оживлённый мегаполис – тысячи процессов одновременно требуют внимания, ресурсов и времени. В этих джунглях операций возникают ситуации, когда программа. . .

Работа с gRPC сервисами на C#

UnmanagedCoder 12.05.2025

gRPC (Google Remote Procedure Call) — открытый высокопроизводительный RPC-фреймворк, изначально разработанный компанией Google. Он отличается от традиционых REST-сервисов как минимум тем, что. . .

CQRS (Command Query Responsibility Segregation) на Java

Javaican 12.05.2025

CQRS — Command Query Responsibility Segregation, или разделение ответственности команд и запросов. Суть этого архитектурного паттерна проста: операции чтения данных (запросы) отделяются от операций. . .

Шаблоны и приёмы реализации DDD на C#

stackOverflow 12.05.2025

Когда я впервые погрузился в мир Domain-Driven Design, мне показалось, что это очередная модная методология, которая скоро канет в лету. Однако годы практики убедили меня в обратном. DDD — не просто. . .

При «ручном» прогоне плагина выходит ошибка —

>>> RESTART: C:\Users\andrew\Documents\Minecraft Python\py\plugins\JuicyRaspberryPie\mcpi\pycmdsvr.py
registering command: blk
registering command: hi
Traceback (most recent call last):
  File "C:\Users\andrew\Documents\Minecraft Python\py\plugins\JuicyRaspberryPie\mcpi\pycmdsvr.py", line 84, in <module>
    server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
  File "C:\Users\andrew\AppData\Local\Programs\Python\Python36-32\lib\socketserver.py", line 453, in __init__
    self.server_bind()
  File "C:\Users\andrew\AppData\Local\Programs\Python\Python36-32\lib\socketserver.py", line 467, in server_bind
    self.socket.bind(self.server_address)
OSError: [WinError 10048] Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)

Spigot выдаёт при этом ошибку —

[08:44:55 WARN]: java.net.ConnectException: Connection refused: connect
[08:44:55 WARN]:        at java.net.DualStackPlainSocketImpl.connect0(Native Method)
[08:44:55 WARN]:        at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
[08:44:55 WARN]:        at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
[08:44:55 WARN]:        at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
[08:44:55 WARN]:        at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
[08:44:55 WARN]:        at java.net.PlainSocketImpl.connect(Unknown Source)
[08:44:55 WARN]:        at java.net.SocksSocketImpl.connect(Unknown Source)
[08:44:55 WARN]:        at java.net.Socket.connect(Unknown Source)
[08:44:55 WARN]:        at java.net.Socket.connect(Unknown Source)
[08:44:55 WARN]:        at java.net.Socket.<init>(Unknown Source)
[08:44:55 WARN]:        at java.net.Socket.<init>(Unknown Source)
[08:44:55 WARN]:        at org.wensheng.plugins.JuicyRaspberryPie.onCommand(JuicyRaspberryPie.java:153)
[08:44:55 WARN]:        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
[08:44:55 WARN]:        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)
[08:44:55 WARN]:        at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:649)
[08:44:55 WARN]:        at net.minecraft.server.v1_12_R1.PlayerConnection.handleCommand(PlayerConnection.java:1397)
[08:44:55 WARN]:        at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1232)
[08:44:55 WARN]:        at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:45)
[08:44:55 WARN]:        at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:1)
[08:44:55 WARN]:        at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13)
[08:44:55 WARN]:        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
[08:44:55 WARN]:        at java.util.concurrent.FutureTask.run(Unknown Source)
[08:44:55 WARN]:        at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46)
[08:44:55 WARN]:        at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748)
[08:44:55 WARN]:        at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406)
[08:44:55 WARN]:        at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679)
[08:44:55 WARN]:        at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577)
[08:44:55 WARN]:        at java.lang.Thread.run(Unknown Source)

Файл на который ругается —

# wenshengwang at gmail dot com
# BSD License
"""This is a TCP server. It is started by the JuicyRaspberryPie plugin and
listen on localhost port 32123.
When it start, it scan the "pplugins" directory for any python files and try
to load them as modules, in these modules, it search for any functions whose
docstring starts with "_mcp" and register them as commands.
When the server receive a command, if it matches one in the registry, it will
be executed. If not, it will execute a dummy command.
"""

import os
import sys
import glob
import socketserver
import threading
import types
import importlib

plugin_dir = os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))
sys.path.insert(0, plugin_dir)
from mcpi.minecraft import Minecraft

HOST = 'localhost'
# TODO: read port from config.yml
PORT = 4444

KEEP_RUNNING = True
def keep_running():
    return KEEP_RUNNING

# command registry
mc_functions = {}

pp_files = glob.glob(os.path.join(plugin_dir, "pplugins", "*.py"))
# import all files and put minecraft function into the mc_functions dict
for pp_file in pp_files:
    basename = os.path.basename(pp_file)
    if basename != "__init__.py":
        try:
            module = importlib.import_module("pplugins." + basename[:-3])
            for item in dir(module):
                if isinstance(module.__dict__[item], types.FunctionType):
                    docs = module.__dict__[item].__doc__
                    if docs and docs.startswith("_mcp"):
                        print("registering command:", module.__dict__[item].__name__)
                        mc_functions[item] = module.__dict__[item]
        except (NameError, ImportError) as e:
            print(e)


def chat(msg="Whaaat?!"):
    mc = Minecraft.create()
    mc.postToChat(msg)


class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        global KEEP_RUNNING
        self.data = self.request.recv(1024)
        # firt 2 bytes are length info, from Java's writeUTF
        args = self.data[2:].decode('utf-8').split()
        cmd = args[0]
        if cmd == "list":
            s = "Available commands: %s" % ( " ".join(list(mc_functions.keys())))
            self.request.sendall(s.encode('utf-8'))
            threading.Thread(target=chat, args=(s,), kwargs={}).start()
            return
        if cmd == "help":
            s = 'JuicyRaspberryPie: put your Python files in pplugins, then "/p cmd" to call your function, "/p list" to see list of commands'
            self.request.sendall(s.encode('utf-8'))
            threading.Thread(target=chat, args=(s,), kwargs={}).start()
            return
        if cmd == "BYE":
            print("got shutdown request, signing off")
            KEEP_RUNNING = False
            return
        threading.Thread(target=mc_functions.get(cmd, chat), args=tuple(args[1:]), kwargs={}).start()
        self.request.sendall("ok".encode('utf-8'))

if __name__ == "__main__":
    server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
    def server_serve():
        while keep_running():
            server.handle_request()
    threading.Thread(target=server_serve).start()

������� Process Explorer, ����� ��� �������� 1� (� ��� ����� ���������) � ����� ��.

������� �� ��������� �������:

1. ����������� ��������� �������� ������. �� ��������� �� 5000, ����� ���������� �� 65536.
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort
2. ����� ��������� ����� ���������� ���������� � ��������� �������� � 4 ����� �� 30 ������.
HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\TCPTimedWaitDelay

3. ������� ���� (���������, �������� � ��.) ���������� ����� 1�


�������, ������������ ������� ��������, � ��� ������� ��� ������ ��� ��������. ���� � ���������� - ����� ����������! :)

 

What does «»Only one usage of each socket address (protocol/network address/port) is normally permitted» mean?

This error means all available ports on the machine are being exhausted. 

By default the OS only has around 4000 ports available that are not reserved by the system. When any network connection is closed, it goes into a TIME_WAIT state for 240 seconds and cannot be reused until this wait state is over.

For example, if there are 16 connections per second for 4 minutes (16*4*60=3840), you will exhaust all the ports shortly thereafter. If HAS and the MTA are on the same machine, this exhaustion will occur sooner. This is because in addition to them communicating with one another and taking up two ports, the MTA uses a significant number of ports to send mail. 

How do I resolve this error?

You can fix this by modifying the below values.

  1. Increase the dynamic port range. The max by default is 5000. You can set this up to 65534. HKLMSystemCurrentControlSetServicesTcpipParametersMaxUserPort is the
    key to use.

  2. Reduce the TIME_WAIT state. The default setting is 4 minutes, but you can set this to 30 seconds. HKLMSystemCurrentControlSetServicesTcpipParametersTCPTimedWaitDelay is the key to use.

After these changes are made, the system must be restarted.

For more information, please refer to this Microsoft article.



Сообщ.
#1

,

    Member

    Рейтинг (т): 7

    Привет. Пытаюсь сделать простого клиента, который подсоединяется к серверу. Клиент должен быть запущен на определенном порту, т.е. вызываю bind.
    Сервер привязывается к 127.0.0.1:7777 а клиент к 127.0.0.1:7778. Система WinXP SP3.

    И вот какая странная штука получается: клиент работает без ошибок через раз! Т.е. бывает нормально идут соединения а бывает следующая ошибка: когда я подсоединяюсь к серверу, то первый раз все работает отлично (и bind, и connect), клиент и сервер обмениваются сообщениями. После этого клиент завершается и обязательно вызывается WSACleanup и даже не нужный для Windows Sockets 2 WSACancelBlockingCall(на всякий случай)! И когда я снова пытаюсь подсоединится к серверу вылетает следующая ошибка WSAEADDRINUSE(10048)(Обычно разрешается одно использование адреса сокета).

    Причем странно, что это ошибка вылезает после вызова connect, хотя перед этим вызов bind происходит без ошибки!? Даже когда полностью закрываешь приложение клиента все равно вылезает ошибка.

    Я решил посмотреть какие коннекты есть в системе и выяснилось, что после того как сервер и клиент обменяются информацией и оба закроют сокеты в системе остается соединение с именем процесса [System Process] и остальными данными точно такими же как и у акцептованного сервером сокета (входящее с 127.0.0.01:7778 на 127.0.0.01:7777).

    Это соединение через пару минут пропадает и странно, что OutpostFirewall его не видит вообще. Я поначалу думал, что это из-за фаерволла, но отключив его да и антивирус вдобавок, убедился, что ошибка все равно возникает.

    Дальше я пробую установить в 1 для клиента с помощью setsockopt параметр SO_REUSEADDR, который разрешает — «Allow the socket to be bound to an address which is already in use». Все равно та же ошибка вылетает!

    Далее я пробую разные версии библиотеки Windows Sockets DLL от 1 до 2.2. Все равно та же ошибка!

    Странно также, что сервер запускается и останавливается без проблем без оставления каких-либо соединений с именем [System Process]. Это соединение остается в системе на некоторое время только когда происходит операция accept сервера для клиента, т.е. когда сервер создает параллельное соединение(входящее с 127.0.0.1:7778 на 127.0.0.0.1:7777). Т.е. получается как бы именно этот сокет «превращается» в [System Process] после того как и клиент, и сервер закрывают свои сокеты. Причем даже при закрытии приложения сервера все равно остается в системе на некоторое время(3-4 мин.).

    Может кто сталкивался с проблемой? Понимаю, что если клиент и сервер будут на разных компьютерах, то проблеиы в принципе не будет. Также если не использовать bind для клиента, то все вроде бы работает, но эти [System Process] остаются для каждого коннекта клиента акцептованного сервером, просто порты назначаются каждый раз новые и ошибки WSAEADDRINUSE не происходит.

    PS: Т.е. получается система как бы блокирует порт, который использовался для соединений на какое-то время! Но Брандмауэр Windows отключен…

    Сообщение отредактировано: Grad

    Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии
  • Xerox phaser 3100 windows 8 x64 print driver
  • Hiseeu программа для windows
  • Как установить тему оформления на windows 10
  • Что такое семафор в windows
  • Easy context menu для windows 11