서버가 종료된 후에 다시 열면bind:addressalready inuse 솔루션이 나타납니다

1522 단어 솔루션
우선, 우리는 먼저 성명한다:bind:addressalready inuse의 존재는 합리적이며, 서버가 종료된 후에 TIME_WAIT 상태, 다시 열면 나타납니다:bind:address already in use.
서버 측은 가능한 한 REUSEADDR (귀속되기 전에 setsockopt를 호출하여 REUSEADDR를 설정할 수 있습니다) 플러그인 옵션을 사용할 수 있습니다. 그러면 TIME_WAIT 상태로 서버를 재부팅할 수 있습니다. 즉, TIME_WAIT 상태는 여전히 존재하지만 서버를 다시 시작하는 데는 영향을 주지 않습니다.
그러나 우리가 지난 2-4분을 기다린 후에 실행하면 이런 상황이 없다. 해석하기 쉽다. 그것은 단지 일정한 시간 안에 이 포트가 점용되고 오고 방출되지 않았기 때문이다. 그러나 2-4분 후에 포트가 방출되기 때문에 이 프로그램을 정상적으로 실행할 수 있다.
      TIME_WAIT: 당사는 close()를 자발적으로 호출하여 연결을 끊고 상대방의 확인을 받은 후 상태가 TIME_WAIT.TCP 프로토콜 규정 TIME_WAIT 상태는 2MSL (즉, 세그먼트 최대 생존 기간의 2배) 을 유지하여 기존 접속 상태가 새 연결에 영향을 미치지 않도록 합니다.에 있음 TIME_WAIT 상태의 접속이 차지하는 리소스는 코어에서 방출되지 않으므로 서버로서 가능한 한 TIME_ 를 줄이기 위해 사전 예방적으로 연결을 끊지 마십시오WAIT 상태로 인한 자원 낭비현재 회피 TIME_WAIT 리소스를 낭비하는 방법은 socket의 LINGER 옵션을 닫는 것입니다.그러나 이러한 방식은 TCP 프로토콜이 권장하지 않는 것으로 어떤 경우에는 오류가 발생할 수 있습니다.
솔루션:
우리가 사용할 때: setsockopt 및 SO_REUSEADDR 시: 대기 시간을 충분히 줄이고 한 번의 통신이 끝나면 이 프로그램을 다시 실행할 수 있습니다. 그러면 위와 같이 bind:addressalready in use가 나타나지 않습니다.
프로그램은 다음과 같습니다. (bind 전에 호출하여 포트의 재사용을 향상시킵니다.)
// 
int on;
if(setsockopt(g_ptSerContext->iServerFd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(int))<<0)
{
	 perror("setsockopt error
"); return 0; } if(bind(g_ptSerContext->iServerFd,(struct sockaddr *)&g_ptSerContext->SockAdd,\ sizeof(g_ptSerContext->SockAdd))==-1) { perror("bind error
"); return 0; }

다음에서 시작합니다.https://blog.csdn.net/msdnwolaile/article/details/50743254

좋은 웹페이지 즐겨찾기