Подтвердить что ты не робот

Bind failed: адрес уже используется

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

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

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

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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