socket 통신 client에서 write()시 process 죽음
글쓴이: cpulpul / 작성시간: 월, 2004/04/12 - 11:41오전
로그서버가 아래와 같이 생성되었습니다.
socket 생성 socket option (SO_REUSEADDR) nonblocking setting socket fd bind() listen() for (;;) { poll() 무한대기 accept() nonblocking setting socket fd read() dbstore() }
로그전송 클라이언트가 아래와같이 생성되었습니다.
socket 생성 nonblocking setting socket fd connect(); select() /* connect() 오류검사 */ socket option (SO_LINGER) for(;;){ write() }
일반적으로 process가 죽을경우 read()나 write() 함수에서
에러를 리턴하여 알수있습니다.
위의 경우 client process를 kill로 죽일때 서버에서 감지하여 close()를
수행합니다
반대로 server의 process를 kill로 죽일때 client에서 감지하지 못하고
write()를 한번수행하고 다음번 write()에서 perror()수행도 하지 않고
process가 죽게 됩니다.
잘못된부분이 있는지 지적해 주십시요
linux, x86 cpu를 사용하고 있으며 모든함수에서 에러를 처리를 하고 있습니다.
Forums:
socket write 시 SIGPIPE 시그널을 발생시키는 경우를 확인
socket write 시 SIGPIPE 시그널을 발생시키는 경우를 확인하시구요.
보통은 프로그램 시작시 이를 무시하도록 합니다.
p.s. 300 까지 하나 남았습니다... 아싸.... -_-;
이벤트 처리처럼 사용하시는 듯 하니 싱글 쓰레드 사용하시겠군요.s
이벤트 처리처럼 사용하시는 듯 하니 싱글 쓰레드 사용하시겠군요.
strace 써 보시지요.
strace -p PID
그러면 죽을 때 뭐땜시 죽는지 나옵니다.
The Future !!!
답변에 감사드립니다.
bugiii님과 sjang님께 감사드립니다.
역시 SIGPIPE 시그널이 발생하였습니다.
음.. 아직 내공수련이 많이 부족한듯 합니다 :oops:
많은 분들이 위경우의 문제발생시 해결방법을 같이 공유하였으면 합니다. :D
한가지 질문을 더드리겠습니다.
client에서 write()함수 수행후 UNP book 13.3와 13.4의 코드를 넣어서
socket time out 을 검사하고 있습니다.
server process가 kill로 죽은후에도 해당 검사에서 오류발생하지 않고
정상리턴을 하고 있습니다.
어떤 오류로 인해 발생하는지 가르침을 부탁드립니다.
client 코드
서버 죽었을때..
위의 소스로는 서버가 죽었는지 알수 없을듯합니다.
보통 서버가 죽었을때 아는 방법은 poll혹은 select로 서버
소켓의 이벤트를 모니터링하다가 event가 발생하면
read를 했을때, 읽은 데이터가 0보다 작거나 같으면
소켓 에러로 처리하여 서버와의 연결을 끊는 방법을 사용합니다.
혹 다른 방법이 있는지는 잘 모르겠습니다. :lol:
서버든 클라이언트든 tcp라면 일정 간격으로 뭔가를 보내보고 돌아오면 접
서버든 클라이언트든 tcp라면 일정 간격으로 뭔가를 보내보고 돌아오면 접속 유지를 하고, 그 보낸 것의 응답이 일정 시간동안 돌아오지 않으면 끊긴 거라고 판단하는 것이 어플리케이션 단에서 할 수 있는 최선으로 알고 있습니다.
같은 네트웍에 서버와 클라이언트가 있지 않다면, 끊긴지를 물리적으로 알 수 있는 방법이 없습니다. 그리고 사용자의 컴퓨터가 그냥 확 꺼진다거나 그런것은 더더욱... 뭔가를 보내보고 받아보지 않고는 확신할 수 없습니다.
p.s. 아싸... 300 입니다요... -_-;
댓글 달기