it-roy-ru.com

Ошибка привязки: адрес уже используется

Я пытаюсь привязать сокет к порту ниже: 

if( bind(socket_desc,(struct sockaddr *) &server, sizeof(server)) < 0)
{
    perror("bind failed. Error");
    return 1;
}
puts("bind done");

Но это дает:

$ ./serve   
Socket created    
bind failed. Error: Address already in use

Почему возникает эта ошибка?

30
TamiL

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

Также проверьте, привязываете ли вы правильный IP-адрес (я предполагаю, что это будет localhost)

22
Techmonk

Все правильно. Однако, если вы также заняты тестированием своего кода, ваше приложение own может все еще «владеть» сокетом, если он запускается и останавливается относительно быстро. Попробуйте SO_REUSEADDR в качестве опции сокета:

Что именно делает SO_REUSEADDR?

Этот параметр сокета сообщает ядру, что, даже если этот порт занят (в Состоянии TIME_WAIT), продолжайте и в любом случае используйте его повторно. Если он занят, но с другим состоянием вы все равно получите адрес, который уже используется ошибка. Это полезно, если ваш сервер был выключен, а затем перезапускается сразу, пока сокеты все еще активны на своем порту. Вы Следует помнить, что в случае поступления непредвиденных данных это может привести к путанице ваш сервер, но хотя это возможно, это маловероятно.

Было отмечено, что «сокет - это 5 Tuple (proto, local Addr, local port, remote addr, remote port). SO_REUSEADDR просто говорит , Что вы можете повторно использовать локальные адреса. 5 Tuple по-прежнему должен быть уникальный!" Майкл Хантер ([email protected]). Это правда, и это именно поэтому очень маловероятно, что неожиданные данные когда-либо будут видны ваш сервер. Опасность состоит в том, что такой 5 Tuple все еще плавает вокруг в сети, и пока он подпрыгивает, новое соединение с того же клиента, в той же системе, происходит то же самое удаленный порт. Это объясняется Ричардом Стивенсом в «2.7 Пожалуйста объяснить состояние TIME_WAIT. ''.

47
Joe

У вас есть процесс, который уже использует этот порт. netstat -tulpn позволит найти идентификатор процесса, который использует определенный порт.

23
Ed Heal

Как уже упоминалось выше, порт уже используется . Это может быть связано с несколькими причинами 

  1. какое-то другое приложение уже использует его. 
  2. Порт находится в состоянии close_wait, когда ваша программа ожидает, пока другой конец закроет program.refer ( https://unix.stackexchange.com/questions/10106/orphaned-connections-in-close-wait-state ).
  3. Программа может быть в состоянии time_wait. вы можете подождать или использовать опцию сокета SO_REUSEADDR, как упоминалось в другом посте.

Выполните netstat -a | grep <portno>, чтобы проверить состояние порта.

5
Pradheep

Address already in use означает, что port, который вы пытаетесь выделить для текущего выполнения, уже занят/выделен какому-то другому процессу.

Если вы разработчик и работаете над приложением, которое требует большого тестирования, у вас может быть экземпляр того же приложения, работающего в фоновом режиме (возможно, вы забыли правильно его остановить)

Поэтому, если вы столкнулись с этой ошибкой, просто посмотрите, какое приложение/процесс использует порт.

В Linux попробуйте использовать netstat -tulpn. Эта команда выведет список процессов со всеми запущенными процессами. 

Проверьте, использует ли приложение ваш порт.Если это приложение или процесс является еще одним важным, вы можете использовать другой порт, который не используется каким-либо процессом/приложением.

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

Если вы находитесь в среде Linux, попробуйте,

  • Используйте netstat -tulpn для отображения процессов
  • kill <pid> Это остановит процесс

Если вы используете Windows,

  • Используйте netstat -a -o -n для проверки использования порта
  • Используйте taskkill /F /PID <pid>, чтобы убить этот процесс
4
prime

Я также сталкивался с этой проблемой, но решил ее . Убедитесь, что программы на стороне клиента и на стороне сервера находятся в различных проектах в вашей IDE, в моем случае NetBeans. Затем, если вы используете localhost, я рекомендую вам реализовать обе программы как два разных проекта.

0
AyanG_WAP7