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

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

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

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

6 ответов


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

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


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

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

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

было указано, что " сокет-это кортеж 5 (proto, local addr, локальный порт, удаленный addr, удаленный порт). Самого себя так говорит что ты можешь повторное использование локальных адресов. Кортеж 5 все еще должен быть уникальный! Майкл Хантер (Michael Hunter) mphunter@qnx.com). Это правда, и это вот почему очень маловероятно, что неожиданные данные когда-либо будут замечены ваш сервер. Опасность заключается в том, что такой кортеж 5 все еще плавает вокруг в сети, и в то время как он подпрыгивает, новое соединение от того же клиента, в той же системе, случается получить то же самое удаленный порт. Это объясняется Ричардом Стивенсом в " 2.7 Please объясните Состоянии TIME_WAIT.".


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


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

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

Do netstat -a | grep <portno> для проверки состояния порта.


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

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

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

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

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

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

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

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

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

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

Я также столкнулся с той же проблемой. Но я решил:)
убедитесь, что обе программы для ClientSide и ServerSide находятся на разных проекты В вашей среде IDE, в моем случае это NetBeans. Тогда, предполагая, что вы используете localhost, я рекомендую вам реализовать обе программы как два разных проекта. Спасибо !