Ошибка WSAEADDRINUSE с кодом 10048 и текстом «Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)» возникает в момент, когда программа пытается выполнить привязку bind() к порту, который уже занят другим процессом или находится в состоянии ожидания TIME_WAIT. Типичный сценарий: вы запускаете локальный сервер разработки, игровой сервер, Apache или Nginx, а приложение мгновенно завершается с этим сообщением. Проблема не в самой программе — операционная система просто отказывается отдавать порт второй раз.

Хорошая новость в том, что ошибка почти всегда диагностируется за пару минут штатными средствами Windows. Достаточно узнать, какой процесс удерживает порт, и либо завершить его, либо назначить своему приложению другой порт. Ниже разберём все сценарии: от банального дубля запущенной программы до исчерпания динамических портов и конфликтов со службами.

Что означает ошибка 10048 на техническом уровне

Сокет — это комбинация IP-адреса, протокола и номера порта. Когда приложение вызывает bind(), система проверяет, не занята ли уже эта комбинация. Если другой процесс успел выполнить привязку раньше, Windows возвращает код WSAEADDRINUSE (10048), который программы часто выводят в переведённом виде — «обычно разрешается только одно использование адреса сокета».

Есть и второй, менее очевидный механизм. После закрытия TCP-соединения порт некоторое время остаётся в состоянии TIME_WAIT — это штатное поведение протокола, защищающее от смешивания пакетов старой и новой сессий. Если сервер перезапускается слишком быстро, порт может быть формально свободен (процесса нет), но система всё ещё считает его занятым. Именно поэтому многие серверные приложения используют опцию SO_REUSEADDR, позволяющую повторно занять адрес в определённых условиях.

⚠️ Внимание: не путайте ошибку 10048 с 10049 («требуемый адрес для своего контекста неверен»). Первая означает, что порт занят, вторая — что указанный IP-адрес вообще не принадлежит этому компьютеру. Лечатся они по-разному.

Как найти процесс, который занял порт

Первый практический шаг — определить виновника. В Windows для этого есть встроенная утилита netstat. Откройте командную строку или PowerShell (желательно от имени администратора) и выполните:

netstat -ano | findstr :8080

Вместо 8080 подставьте порт из сообщения об ошибке. В последнем столбце вывода будет PID — числовой идентификатор процесса. Чтобы узнать, какой программе он принадлежит, выполните:

tasklist | findstr 1234

Здесь 1234 — найденный PID. Альтернативный путь без командной строки: откройте Диспетчер задач, перейдите на вкладку «Подробности» и найдите процесс по столбцу «ИД процесса». Если столбца нет, его можно включить через контекстное меню заголовков таблицы.

💡

В PowerShell можно получить и порт, и имя процесса одной командой: Get-NetTCPConnection -LocalPort 8080 | Select-Object OwningProcess — затем посмотреть владельца через Get-Process -Id .