|
블로킹 소켓에 대해 저두 조금 혼동이 되서 위키피디아를 찾아 보았습니다.
Berkeley sockets can operate in one of two modes: blocking or non-blocking. A blocking socket will not return control until it has sent (or received) some or all data specified for the operation. It is normal for a blocking socket not to send all data. The application must check the return value to determine how many bytes have been sent or received and it must resend any data not already processed [1].
블러킹 소켓이 모든 데이터를 송신하지 않는경우가 있어서 항상 리턴값을 확인 해야 한다는군요,
음.. 그리고 TCP에선 MTU가 문제 되지 않는군요, 그래도 UDP에선 되겠죠...
Lyn 님이 쓰신 글 :
: MTU 문제는 IP/Ethernet 레벨에서의 문제일뿐 TCP에선 딴나라얘기입니다.
:
: nansama 님이 쓰신 글 :
: : 블로킹기능은 한개의 패킷을 수신할 때까지 TIME_OUT 시간 이내에서 대기 한다는 뜻이지
: : 특정 사이즈를 모두 수신 할 때까지 기다리는 기능이 아닙니다.
: :
: : 패킷은 공유기나 라우터의 MTU(Maximum Transmission Unit) 사이즈 이내에서 편의적으로 짤려서 옵니다.
: : 보통 MTU가 1500 바이트 보다 작기 때문에 그보다 큰 데이터를 한번에 수신 하는것은
: : 공유기나 라우터를 한개라도 거치는 환경에서는 불가능 합니다.
: :
: : 따라서 인디도 TCP나 UDP 레벨에서는 긴데이터는 잘려서 오기 때문에 여러번 수신해야 할 것입니다.
: : < 추가 :다만 자동으로 패킷을 여러번 송수신 해주는 TCPClient.IOHandler.WriteFile 이나 LargeStream 관련
: : 함수를 사용하면 자체적으로 한번에 보내는것 처럼 구현할 수 있어 보입니다.>
: :
: : 용맨소녀 님이 쓰신 글 :
: : : 잘리지 않을 것 같은데.. 지금까지 잘리지 않는다고 생각하고 썼고요..
: : :
: : : 100% 절대 잘릴 일이 없는건가요? 여기에 대해선 잘 모르겠어요..
|