TCP서버에서 accept 중 문제가 발생했을 경우 처리방법
글쓴이: dh1789 / 작성시간: 수, 2011/04/27 - 5:53오후
안녕하세요
TCP 소켓에 대해서 공부하는 중 궁금한 점이 있어서 이렇게 포스팅을 합니다.
select를 이용한 TCP서버를 작성하는 중인데요
서버의 소켓 디스크립터가 set되면 accept을 수행하여 연결을 확립하는데요
이 과정에서 만약 문제가 생길경우, 그러니까 A가 서버에 접속을 요청하고 accept에서 문제가 생겨서 블럭이 된 상황에서
B가 서버에 접속을 요청할 경우 접속에 실패하게 되는데요
이렇게 문제가 되는 상황에서도 B가 제대로 접속하게 하는 방법이 있을까요?
정리하면.. 발생순서는 다음과 같습니다.
1. 서버 listen
2. A접속 요청
3. 서버 accept 수행 중 블럭 발생
4. B접속 요청
5. B접속 실패 <=== 문제점
많은분들의 조언 부탁드립니다
Forums:
Accept 소켓 생성후 NON 블럭 설정으로 바꾸고
Accept 소켓 생성후 NON 블럭 설정으로 바꾸고 select 해보세요.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
음.. 제말은.. 논블럭으로 바꾸면 A에 대한
음.. 제말은.. 논블럭으로 바꾸면 A에 대한 결과값은 얻을 수 있는데..
이때 A가 처리되지 않은 상황에서 B가 연결요청하면
상식적으로는 A가 처리될 때까지 기다리게 되잖아요. (서버소켓을 읽는 중이기 때문에;;)
이 상황에서도 B를 처리할 수 있는 방법이 있는지 궁금합니다.
리슨 소켓의 backlog 설정을 참고하세요
리슨 소켓의 backlog 설정을 참고하세요
네 답변 감사합니다. 그런데 해당부분을
네 답변 감사합니다.
그런데 해당부분을 확인해봤는데.. 이 값은 accept이 되지 않은 연결을 몇개까지 관리할지를 결정하는 값 아닌가요??
제가 질문드린 내용은 A가 데이터 전송 중 문제가 생겨서 블럭이 된 상태에서도
B가 연결요청 시 서버에서 accept을 할 수 있는지입니다.
이미 Accept를 했으면 리슨 소켓의 관할이
이미 Accept를 했으면 리슨 소켓의 관할이 아니지요.
음.. 예기하신 말씀이 맞습니다. 그런데
음.. 예기하신 말씀이 맞습니다.
그런데 accept을 하는 중 예외상황이 생겨서 작업이 일정시간 지연된다거나..하는 경우에서
다음 연결요청을 어떻게 처리할지가 제가 궁금해 하는 주된 내용입니다.
accept(2) 맨페이지를 우선 자세히 살펴보시길
accept(2) 맨페이지를 우선 자세히 살펴보시길 바랍니다. 지나가다가 첨언하자면 적어놓으신 아래의 step 은 절대 있을 수 없습니다.
1. 서버 listen
2. A접속 요청
3. 서버 accept 수행 중 블럭 발생
4. B접속 요청
5. B접속 실패 <=== 문제점
3 단계 accept(2) 에서 블럭이 발생한다는 건 backlog queue 에 connection 이 존재하지 않고 origin socket 이 blocking 이라는 겁니다. 근데 2 단계에 A접속 요청을 하셨으면 *절대* 블럭이 발생할 수 없습니다. A접속 중 오류가 발생하였다면 accept(2) 는 보통 -1 과 ECONNABORTED 을 반환하게됩니다.
3번 동작에서 블럭이라는 표현이 의미전달이 잘못된것
3번 동작에서 블럭이라는 표현이 의미전달이 잘못된것 같습니다.
여기에서 블럭이란 소켓의 블럭, 논블럭이 아니구요
예외상황이 발생해서 응답이 없을 때를 예기하는 것입니다.
select등으로 이벤트가 감지되어 accept를 호출하는데
일정시간(10초?)이 지나도록 accept를 수행했는데도 응답이 없는 경우 말입니다.
제가 궁금한 건 이렇게 기다리는 시간안에 4번과 5번 동작이 발생되는 경우입니다.
그경우가 클라이언트가 접속하자 마자 끊어 버리는 경우
그경우가 클라이언트가 접속하자 마자 끊어 버리는 경우 발생할수 있는걸로 알고 있습니다.
(connect 후 close)
그래서 넌블럭 모드로 바꾸고 하면 에러 처리를 할수 있는걸로 알고 있습니다.
The C++ NetworkProgrmming Volum1에서 본것 같군요.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
아.. 그렇군요 논블럭 모드 설정 후 관련 예외
아.. 그렇군요
논블럭 모드 설정 후 관련 예외 처리방법을 더 살펴봐야겠네요
좋은답변 감사합니다 도움이 많이 되었습니다 ^^
말씀 하신 내용 또한 *절대* OS 상에서 일어날 수
말씀 하신 내용 또한 *절대* OS 상에서 일어날 수 없는 겁니다. 만약 정말로 일어난다면 그건 OS 가 잘못된 것입니다. 즉, select(2) 을 통해서 origin socket 의 READABLE 이벤트를 받았는데 막상 accept(2) 을 해보니 read(2) 할께 없다는 건 *절대* 있을 수 없습니다.
설사 client socket 이 backlog queue 에 있는 동안 끊어졌다고 하더라도 ECONNABORTED 가 돌아와야 합니다. 10 초 동안 응답이 없다는 건 READABLE 이 아닌데 READABLE 로 인식하고 accept(2) 을 호출했다는 말밖에 되지 않습니다.
네 저도 뭔가 이상하다고 생각하는데요 예기하신대로
네 저도 뭔가 이상하다고 생각하는데요
예기하신대로 OS가 처리를 해야 정상인데..
지금은 OS가 잘못되었는지 코딩이 잘못되었는지 확인을 먼저 해봐야 할 것 같습니다.
ECONNABORTED 부터 봐야겠네요 ㅎ
답변 감사합니다
댓글 달기