IT이야기

바인딩 실패:이미 사용 중인 주소

cyworld 2022. 4. 25. 21:56
반응형

바인딩 실패:이미 사용 중인 주소

아래의 포트에 소켓을 바인딩하려고 하는 중:

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

이 오류는 왜 발생하는가?

모두가 옳다.그러나 코드를 테스트하느라 바쁘더라도 소켓이 비교적 빨리 시작되거나 중지될 경우 자체 애플리케이션이 여전히 "소유"할 수 있다.SO_REUSEADR을 소켓 옵션으로 사용해 보십시오.

SO_REUSEADR은 정확히 무엇을 하는가?

이 소켓 옵션은 커널에 이 포트가 사용 중이라도(TIME_WAIT 상태에서) 계속하여 다시 사용하라고 알린다.사용 중이지만 다른 상태일 경우, 이미 사용 중인 주소가 계속 오류로 표시됨.이 기능은 소켓이 포트에서 여전히 활성화된 상태에서 서버가 종료된 후 즉시 재시작된 경우에 유용하다.예상치 못한 데이터가 들어오면 서버를 혼란스럽게 할 수 있지만, 이것이 가능하기는 하지만 그럴 가능성은 낮다는 것을 알아야 한다.

"소켓은 5투플(프로토, 로컬 애드러, 로컬 포트, 원격 애드러, 원격 포트)이다"라고 지적돼 왔다.SO_REUSEADR은 로컬 주소를 재사용할 수 있다고 말함.5개의 튜플은 여전히 독특해야 한다!" 라고 마이클 헌터(mphunter@qnx.com)가 말했다.이것은 사실이고, 이것이 당신의 서버가 예상치 못한 데이터를 볼 가능성이 매우 낮은 이유다.위험은 그러한 5개의 튜플이 여전히 네트 위에서 떠다니고 있고, 그것이 튕기고 있는 동안, 같은 시스템에 있는 같은 클라이언트로부터의 새로운 연결이 우연히 같은 원격 포트를 얻는다는 것이다.이는 리처드 스티븐스가 ''2.7 TIME_WAIT 상태'''에서 설명한 것이다.

Address already in use라는 뜻이다.port현재 실행이 이미 사용 중이거나 다른 프로세스에 할당하려고 하는 경우.

개발자 및 많은 테스트가 필요한 응용 프로그램을 작업하는 경우 백그라운드에서 실행되는 동일한 응용 프로그램의 인스턴스가 있을 수 있음(제대로 중지하는 것을 잊은 경우)

따라서 이 오류가 발생하면 포트를 사용하는 애플리케이션/프로세스만 확인하십시오.

Linux에서 다음을 시도해 보십시오.netstat -tulpn은 실행 인 모든 이 명령은 실행 중인 모든 프로세스를 포함하는 프로세스 목록을 나열한다.

응용 프로그램이 포트를 사용하고 있는지 확인하십시오. 만약 그 응용 프로그램이나 프로세스가 또 다른 중요한 것이라면, 당신은 어떤 프로세스/응용프로그램에서도 사용되지 않는 다른 포트를 사용하고 싶을 것이다.

어쨌든 당신은 당신의 포트를 사용하는 프로세스를 중지하고 당신의 애플리케이션이 그것을 가져가도록 할 수 있다.

만약 당신이 리눅스 환경에 있다면, 시도해보아라.

  • 사용하다netstat -tulpn공정을 표시하다
  • kill <pid>이렇게 하면 프로세스가 종료된다.

만약 당신이 창문을 사용한다면,

  • 사용하다netstat -a -o -n항구 사용량을 검사하다
  • 사용하다taskkill /F /PID <pid>그 과정을 없애다

이미 그 포트를 사용하고 있는 프로세스가 있다. netstat -tulpn특정 포트를 사용하는 프로세스 ID를 찾을 수 있다.

이 오류는 일반적으로 열려는 포트가 다른 응용 프로그램에서 이미 사용되고 있음을 의미한다.netstat를 사용하여 열려 있는 포트를 확인한 다음 사용 가능한 포트를 사용하십시오.

또한 올바른 IP 주소에 바인딩되어 있는지 확인하십시오(로컬 호스트일 것으로 가정함).

만약 주소가 이미 사용중이라면 당신은 단지 항구를 사용하는 모든 과정을 죽이고 싶은가, 당신은 사용할 수 있다.

lsof -ti:PortNumberGoesHer | xargs kill -9

이것의 근원과 영감.

PS: netstat가 아직 설치되지 않았기 때문에 사용할 수 없음.

위에서 언급한 바와 같이 항구는 이미 사용 중이다.이것은 몇 가지 이유 때문일 수 있다.

  1. 어떤 다른 애플리케이션은 이미 그것을 사용하고 있다.
  2. 입항 중이다.close_wait프로그램이 다른 종료될 때까지 기다리고 있는 경우를 명시하십시오(https://unix.stackexchange.com/questions/10106/orphaned-connections-in-close-wait-state)를 참조하십시오.
  3. 프로그램이 실행 중일 수 있음time_wait당신은 기다릴 수 있거나 소켓 옵션을 사용할 수 있다.SO_REUSEADDR다른 게시물에 언급된 바와 같이

하다netstat -a | grep <portno>좌현 상태를 점검하기 위해.

모든 노드 프로세스를 종료하려면:

killall -9 node

나도 그 문제에 직면하고 있었지만 해결했다.클라이언트 측 및 서버 프로그램이 모두 IDE의 다른 프로젝트, 즉 내 경우 NetBeans에 있는지 확인하십시오.그럼 localhost를 사용한다고 가정해보면, 두 프로그램을 모두 다른 두 프로젝트로 구현하는 것을 추천한다.

또한 양말 파일에 충분한 권한을 부여하지 않은 경우에도 발생한다!

양말에 포함된 폴더와 양말 파일에 예상 권한을 추가하십시오.

 chmod ug+rw /path/to/your/
 chmod ug+rw /path/to/your/file.sock

그럼 재밌게 놀아!

참조URL: https://stackoverflow.com/questions/15198834/bind-failed-address-already-in-use

반응형