소켓 통신에서....

kn31232의 이미지

서버에서 recv를 실행했을 경우 보통 recv는 block 모드로 실행이 됩니다.

하지만 연결된 클라이언트가 종료하였을 경우 non-block 모드로 바뀌는거 같은데....

block되지 않고 무한루프에 빠지는걸 보면 non-blocking 되는게 맞는거 같습니다...^^;

음...다시 recv를 blocking모드로 바꾸거나....혹은...이때 발생되는 signal에 관련하여 아시는분 계신가요...!?

recv한 데이터에 관하여 db에 저장하는 프로그램을 짜고있는데 클라이언트가 죽어버리는 순간 db에 엄청난 쓰레기들이 순식간에 싸여버리네요....무한 루프안에서...ㅡㅡ;;;

어떻게해야할까요~~~!? ㅜ.ㅡ

alsong의 이미지

아마 종료되면 리턴값이 0이 나올겁니다.
넌블럭으로 바뀐게 아니고 fd값이 더이상 유효하지 않아서 그렇습니다.
accept를 다시 호출하시고 새로운 fd를 받아서 그값으로 다시 recv하셔야 합니다.

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

moonzoo의 이미지

클라이언트가 죽었을 경우에

recv는 non-blocking 모드로 바뀌는게 아니라

timeout이 걸려서 0을 리턴하는 것 같습니다.

결국 connection이 종료했음해도 불구하고

recv 관련 루틴을 바로 중지 하지

않아서..DB에 쓰레기 값이 쌓이는것 같군요..

connection 을 종료하고 다시 accept 하는 것이 좋을 듯

합니다.

kn31232의 이미지

님들 덕분에 멋지게 해결했습니다~! 히히~ ^^

그럼 좋은 하루 보내세요~~~★

飛上