소켓 통신에서요...
TCP 통신에서는,
데이터를 peer host로 전송하고 난 이후,
peer host로부터 패킷을 잘 받았다는 ack를 받아야,
데이터 전송이 성공한 것으로 되는데요...
그렇다면,
blocking 소켓을 이용하여 send 함수를 호출하였을때,
send 함수가 패킷 전송 성공을 리턴하는 시점이,
TCP socket send buffer에 packet data를 적재하는 시점에 리턴되나요?
아니면 packet을 실제로 send 하게 되는 시점에 리턴되나요?(ack 받지 않은 상태)
아니면 packet을 실제로 send하고 그에 대한 ack를 받은 시점에 리턴되나요?
첫번째 궁금한 점이 이와 같구요.
두번째로 궁금한 점은 다음과 같습니다.
non-blocking socket을 통해서 packet을 전송하기 위해,
send 함수를 호출하였을때,
성공으로 리턴되는 경우는 어떤 경우인지요?
단지 tcp socket send buffer에 packet data를 적재하는 시점에 성공이 리턴되나요?
아니면 실제로 packet 전송이 되면 성공이 리턴되나요?(ack 받지 않은 상태)
아니면 실제로 packet 전송한 것에 대한 ack를 받은 시점에 리턴되나요?
성공이 리턴되지 않고, 에러가 리턴되었을때,
에러값이 EWOULDBLOCK이면,
select로 write할수 있는 상태를 기다렸다가,
다시 send를 해야 하는 건가요?
아니면, EWOULDBLOCK이 되더라도,
패킷이 tcp send buffer에 쌓여 있기 때문에,
자동으로 send가 되면서 write 할수 있는 상태가 되는건가요?
우매한 제게 가르침을 주시면 감사하겠습니다.
그럼 수고하세요~
ps. 새해 인사도 함께 드립니다^^
새해 복 많이 받으세요~ ^_^
Re: 소켓 통신에서요...
send() 의 blocking mode 에서 성공으로 리턴되는 것은 socket buffer 에 copy 가 끝난 것을 의미합니다.
EWOULDBLOCK나 EAGAIN 은 넌블럭킹에서 실패한 것입니다. 대부분 버퍼 공간이 없는 경우입니다. 당연히 재전송을 해줘야 합니다.
넌블럭킹 모드에서 많이 실수하시는게 성공시 리턴값의 검사인데, 블럭킹 모드와 달리 넌블럭킹은 일부만 리턴되는 경우도 있씁니다. 예를 들어 전송요청한 버퍼의 데이터가 1000바이트여도 500만 리턴되는 경우가 있다는 것이죠. 따라서 리턴값이 양수여도 항상 검사해야 합니다.
========================================
* The truth will set you free.
댓글 달기