본문 바로가기

진리는어디에

블로킹 소켓에서의 send 동작

얼마전에 간단한 서버/클라이언트 프로그램을 만든적이 있다. 어떤 놈이 나에게 못 미더운 듯이 묻기를 왜 recv를 처리하는 곳에는 while을 이용해서 read operation에 대한 오류 처리를 해주는데 send에 대해서는 아무런 처리를 하지 않냐고 했다.

블록킹 소켓일 경우 send 함수는 지정된 바이트를 모두 전송하기 전까진 리턴을 하지 않기 때문에 괜찮다라는 이야기를 친절(?)하게 해주었지만 이 샹콤한 놈의 자식이 아니라고 바득 바득 우기는데야...결국에 실험으로 보여주기는 너무 귀찮아져 man page를 찾아 보여주는 수고까지 해야 했다.

When the message does not fit into the send buffer of the socket, send normally blocks, unless the socket has been placed in non-blocking I/O mode. 
위의 내용을 간단하게 이야기 하자면 blocking 소켓에다가 send 버퍼를 넘어가는 데이터를 전송하라고 요청하면 블록킹 된다는 것이다. 다만 non-blocking 소켓은 EAGAIN 에러를 떨어 뜨린다는 것이다(여기서 우리는 non-blocking 모드에서는 errno를 철저하게 점검해야 하는 필요성을 느낄 수 있다).

한동안 포스팅 안하다가 포스팅이 이런 것이라니...혹시나 또 모르는 사람이 있을까 싶어서 적어 본다.

오늘의 교훈 : 우기지 말것(너 뿐만 아니라 나도-_-;;).
유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!