서버가 종료된 후에 다시 열면bind:addressalready inuse 솔루션이 나타납니다
1522 단어 솔루션
서버 측은 가능한 한 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
브라우저 URL 매개 변수 솔루션getParamValue(매개변수 이름)를 사용하여 값 가져오기 UrlDecode(중국어)를 사용하여 중국어로 복호화 가능...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.