소켓 질문있습니다.
글쓴이: 익명 사용자 / 작성시간: 토, 2002/11/16 - 1:39오후
소켓과 멀티 스레드로 서버 데몬과 러쉬테스트용 클라이언트를 구현중입니
다.
에러는 없습니다.
그런데 클라이언트에서 서버로 많은 컨넥션과 디스컨넥트를 하면 서버의
accept()에서 자꾸 웨이팅이 되는 현상이 발생을 합니다.
나름대로 현상을 조사해 봤더니..
> netstat -an|grep 24080
명령으로 보면, 클라이언트 하나가 접속을 할 때 마다
127.0.0.1.33013 127.0.0.1.24080 32768 0 32768 0
TIME_WAIT
가 하나씩 늘어나더군요.. 그리고 모든 프로세스가 끝나도 없어지지 않구
요... 어떻게 해야 없앨 수 있나요? 아마도 서버의 포트를 재사용 할 수
있도록 하는 setsocket() 처럼 클라이언트도 이미 사용이 끝난 포트를 재
사용할 수 있도록 하면 될 것 같은데... 앞부분이 클라이언트잖아요??
127.0.0.1.33013 부분이요... 이 부분의 포트를 재사용할 수 있도록 하는
방법이 없을까요?
Forums:
Re: 소켓 질문있습니다.
일단은 SO_LINGER 옵션으로 TIME-WAIT를 발생하지 않게는 할 수 있습니
다. TCP에서는 기본적으로 소켓이 TIME-WAIT 상태에 얼마간 있다가
(2MSL) 없어집니다. 계속 소켓을 맺고 끊는다면 2MSL(Maximum Segment
Lifetime) 간 생성되는 소켓수만큼 TIME-WAIT 상태에 있는 소켓들이 늘어
날 수 있습니다. 따라서 2MSL 동안은 TIME-WAIT된 소켓이 계속 증가하고
있는 것을 보실수도 있습니다. SO_LINGER 옵션에서 linger를 on시키고
linger time을 0으로 주시면 TIME-WAIT 상태에 머물지 않고 곧바로 연결
을 종료시킵니다.
다만, 관련된 문서들을 보면, SO_LINGER 를 써서 TIME-WAIT를 없앴을 때
(TIME-WAIT assassination) 발생할 수 있는 문제들에 대해서 언급한 것을
보실 수 있습니다.
accept()가 block되는 것은 좀 이상합니다. 실제로 tcp연결요청이 들어왔
는데도 accept가 블록되는건가요? 짧은 순간 연결을 맺었다가 끊고 하는
것을 반복하면 TIME-WAIT 대기시간보다 짧은 시간안에 로칼 임시포트들이
다 소모되는 일이 발생할 수 있을텐데 (한 4~5만번 정도) 혹시 이러한 이
유로 클라이언트쪽의 connect 쪽이 오류를 리턴하는 일은 발생하지 않았나
요?
Re^2: 다시 소켓 질문있습니다. 고수님..
답변 감사드립니다.
제가 아래와 같이 코딩을 했습니다.
ling.l_onoff = 1;
ling.l_linger = 0;
setsockopt(SocketNumber, SOL_SOCKET, SO_REUSEADDR|SO_LINGER,
(caddr_t)&on, sizeof(on));
그리고 perror("setsockopt");
로 확인해봤더니
setsockopt Option not supported by protocol
이라는 에러가 나오네요...
제가 사용을 잘못한 것인가요?
그렇다면 정확한 사용방법은 어떻게 되는건가요?
답변 부탁드립니다.
댓글 달기