socket State 알아내기....
글쓴이: jiheony / 작성시간: 금, 2004/06/18 - 3:24오후
socket state 를 정확하게 알고 싶습니다.
보통 윈도우에서 사용하는 winsock 컨트롤을 보면...소켓 상태가 0~9까지로 정해져 있습니다.
각각의 상태에따라서 속성처럼 스스로 상태를 체크하지요...
즉 처음 생성된 상태 (closed) = 0
접속 대기 = 2
연결 상태(connect) =7
강제 종료 또는 비정상 종료된 상태 = 8~9
뭐...이렇게 해서 상태를 알 수 있느데요...
리눅스에서 inet 소켓을 사용하여 서버/클라이언트 환경을 꾸밀때...
윈도우 처럼 상태를 알 수 있나요?
제가 원하는건 프로그램이 예기치 않은 상황에서 갑작스럽게 종료되거나 리셋되어 소켓연결이 깨졌을때 (윈속에서는 8,9 번 상태이겠지요..) 이것을 closed 시키고 (0번 상태) 싶거든요...
전 select 로 다중 접속 서버 구현중에 있습니다.
고수님들 도와주세요..TT
Forums:
select 로 해당 fd 의 에러상태를 알 수 없다는 말씀인가요?
select 로 해당 fd 의 에러상태를 알 수 없다는 말씀인가요?
아뇨..그런게 아니라..TT
제가 잘 몰라서...물어보는거에요..
fd 에서 체크하는 방법을 물어보는겁니다. 가장 효율적인 방식에 대해서요..
어느 특정한 때에 소켓의 상태를 알아야 필요가 있나요..?소켓이 쓰거
어느 특정한 때에 소켓의 상태를 알아야 필요가 있나요..?
소켓이 쓰거나 읽거나 혹은 먼가 이벤트를 대기 하거나 한다면..
변화가 있다면 바로 알 수 있습니다.. :)
select 가 돌아가는 while 부분은 다음과 같습니다.
이런 상황에서는 어떻게 해야 하나요?
그러니까....지금은 while 문 돌면서 체크를 해야하는 상황인데 어떻게 하면 각 소켓들의 상태를 알 수 있는지...
select 를 해서 넘어온 후 따로 사용하는 fd 들의 상태를 비교하실
select 를 해서 넘어온 후 따로 사용하는 fd 들의 상태를 비교하실 필요가 없습니다.
select 후에 fd 의 상태를 따로 알아보는 것이 아니라, 지금 상황같으면 read 비트가 켜져있을 때 read 한번 해보면 read 에서 어떤 값을 돌려주는지를 조사해서 해당 동작을 하시면 됩니다. 만약 접속이 끊겼으면 read 는 0을 돌려줄 것이구요. 다른 에러면 -1을 주겠죠. 정상이라면 읽을 바이트수 나올테구요. 0보다 작거나 같으면 소켓 닫아주면 되고 allfds 에서 제외시켜주시면 됩니다.
아니면 select 에 에러셋을 추가로 설정하시든지요.
select 사용법을 정확하게 다시 알아보시는 것이 좋겠습니다. UNP 에 좋은 설명이 있고, 찾아보시면 select 예제도 꽤 많을 것입니다.
댓글 달기