select에서는..
글쓴이: 익명 사용자 / 작성시간: 금, 2002/06/14 - 10:28오전
안녕하세요..
서버 프로그램에서 클라이언트의 비정상 종료시 처리하기 위해서
select를 이용해봤습니다. 근데.
서버에 접속한 후 컴퓨터의 reset버튼을 눌렀을 경우
서버에서는 제대로 처리하지 못합니다. (아무런 반응이 없습니다.)
서버에서는 이렇게 했습니다.
#include `~~
fd_set read_fds;
int total;
int CSock[10];
FD_ZERO(&read_fds);
while(1)
{
for(i = 0; i < total; i++)
FD_SET(CSock[i], &read_fds);
FD_SET(server_sock, &read_fds);
n = select(maxdlf, &read_fds, NULL, NULL, (struct timeval *)0);
if(FD_ISSET(server_sock, &read_fds)
{
//accept
total++;
CSock[total] = client_sock;
}
else
{
if((read(~~~) == 0)
{
//disconnect
}
else
{
//처리...
}
}
}
select로는 해결할 수 없는건가요? 좋은 방법 있다면 좀 알려주세요..
부탁드립니다.
Forums:
Re: select에서는..
select 호출시 일정한 타임아웃을 주지않고 무한정 대기 상태로 호출하시
면 클라이언트에서 컴퓨터를 강제로 종료할때에 처리하기가 까다롭습니
다..그래서 select 호출시 일정한 타임을 주고 그 시간동안 아무런 패킷
이 들어오지 않으면 클라이언트의 비정상 종료로 처리하시면 됩니다..
Re^2: select에서는..
답변 감사드립니다.
근데.. 음.. 염치없는 질문이지만..
클라이언트 연결이 언제 끊어질지 모르거든요..
하나의 클라이언트만 붙는것두 아니구.. 여러개가 붙어요..
접속이 끊어진 시간을 계산해서 디비에 저장해야 하는데요..
접속된 상태에서는.. 아무런 일도 하지 않습니다
그냥 접속만 된 상태.....
ㅜㅡ 넘 죄송합니다..
제가 님의 답변을 잘 이해하지 못한건지... 아님.. ^^;;;
다시한번 부탁드립니다..
Re^3: select에서는..
tcp/ip에서 커넥션이 끊기는 경우 한쪽에서 모르는 경우도 있습니다.. 자
세한건 tcp/ip쪽을 보시구요..
꺙.. 가능하다면 먼가 커넥션을 확인해 볼 수 있는 코드를 넣어보는
건 어떨까요? select에 타임 기능을 이용하든지 알람을 이용하든지 해서
적당한 시간마다 한번씩 클라이언트들의 커넥션을 주욱 확인해
보는겁니다..
아무튼 님께 맞는 적당한 방법을 찾아보심이... v--;
Re^3: select에서는..
아래 어떠분이 답변하셨듯이 방법은 여러가지가 있을수 있습니다..
상황에 따라서 적당한 방법을 선택하시면 됩니다..
참고로 제가 예전에 사용했던 방법은 각 클라이언트마다 타이밍을
관리하는 변수를 만들고 select에서 일정 시간동안 아무 패킷도 들어오지
않은 클라이언트에 이시간값을 계속 타이밍 변수에 저장했다가 그 타이밍
이 일정 시간지나면 비정상 종료로 처리하는 방법을 사용한적이 있습니다.
댓글 달기