[완료]socket 에 listen함수에 대해서 질문을 드리겠습니다.
글쓴이: anaud2 / 작성시간: 수, 2008/11/05 - 10:37오후
안녕하세요
socket에서 서버가 listen함수에 대해서 질문드립니다.
int listen(int socketfd, int backlog);
여기서 "backlog는 인자는 아직 미결인 연결들에 대한 큐의 늘어날 수 있는 최대 길이를 정의한다" 라고 되어있는데요
그렇다면 이건 클라이언트가 connect 요청을 했을때 받아주는 갯수라고 생각이 드는데요
connect에서 무한대기를 할까봐 sigalrm 을 설정했는데요 이것을 테스트하기 위해서 2개의 클라이언트가 서버에 접속 요청을하면
하나가 실패를 하게 하기 위해 backlog값을 0으로 맞췄는데도 두개가 connect 성공을 하네요
backlog는 상관이 없는것인가요 어떻게 해야 클라이언트의 connect가 대기를 할까요
Forums:
backlog 값은 요청
backlog 값은 요청 성공이 아니라 대기가능한 connection의 값입니다.
2개 이상의 연결 요청이 들어 올경우 먼저 들어온 1개만 처리되고, 이후의 연결은 대기 큐에 들어갑니다.
(대기상태기 때문에 블록됩니다.)
listen함수가 다시 불러지면, 대기큐에 들어 있던 connection이 먼저 처리됩니다.
말씀하신 경우는 connect함수가 성공한게 아니라 에러를 리턴한것 같습니다. connect함수의 리턴값과 errno을 먼저 확인해보시고, backlog값을 2이상으로 올려 보시지요
저기...
서버가 backlog 값을 0으로 하고 2개의 클라이언트가 접속을 요청한다음 각각 클라이언트에 errno값을 찍어봤습니다.
/*client*/
if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1)
{
if(errno == EINTR)
{
close(sock);
//return CODE3007;
return 300700;
}
return CODE3002;
}
else
printf("connect[%d]\n",errno);[/code]
소스는 위와 같습니다. errno값을 찍었을때 클라이언트 둘다
connect[0]
이렇게 나오네요 이렇다면 connect이 성공했다는 뜻아닌가요? 대기상태도 아닌거 같은데요.
Connect에는
Connect에는 성공하신것입니다.
소켓의 접속은 생각보다 빨리 이루어집니다. 대기큐에서 뽑아가는 속도가 빠르죠..^^;
Clint에서 동시에 접속을 했다고 하나 제가 볼때는 약간의 시간차가 있었던것 같습니다.
Accept 함수에서 약간의 지연을 주어 접속 대기큐에서 뽑아내는것을 늦게 처리하고 테스트 해보면 될것 같습니다.
댓글 달기