recv()함수에 대한 질문요?
글쓴이: skylandi / 작성시간: 수, 2003/03/19 - 11:35오후
서버에서 send()함수로 클라이언트에게 메세지를 보냅니다.
recv()함수로 메세지를 받을때
한번에 메세지가 올 경우가 생기고
두번을 통해서 메세지가 올 경우가 생기게 됩니다.
TCP 특성상 그렇다고 하던데...
만약에 100바이트를 보낸다고 가정하에
50바이트를 받아왓다고 하면 나머지 50바이트를 받아와야 하는데
재전송 하면 50바이트가 아깝운데...
나머지 50바이트를 이어서 받아올수 잇는 방법은 어떻게 해야 하는지요?
아무런 개념이 없어서 ㅠ
즐거운 하루되시길
Forums:
Re: recv()함수에 대한 질문요?
size = recv( sock, buf, 100, 0 );
이렇게 recv를 호출하였는데 100바이트보다 적게 받았을 경우
버퍼의 포인터를 받은 만큼 이동시켜준 다음..
buf += size
덜 받은 만큼만 recv를 해주시면 됩니다..
recv( sock, buf, 100 - size, 0 );
Re: recv()함수에 대한 질문요?
recv flag 중...
MSG_WAITWALL 쓰면 되지 않나요??
recv(sock , buf, 1000, MSG_WAITWALL); 이라쓰면
recv함수에서 1000바이트때까지 기다리는거라고 알고 있는데
제말이 틀렸다면
고수분들의 하해와 같은 감언을 주셨으면 합니다.
-------------------
나는 Copy&Paster 이다. 나의 화려한 기술 조합에 모두들 나를 두려워 한다. 나도 코드 Maker 이고 싶다.
보통은 저런 문제 때문에 recv를 사용하는 상위 함수를 만들어서그걸
보통은 저런 문제 때문에 recv를 사용하는 상위 함수를 만들어서
그걸 호출합니다.
대게 길이+길이만큼의 데이타 형태로 메시지를 구성하고
길이필드는 고정사이즈 대게 4바이트 network odering으로 구성하고
길이필드에서 명시된 길이만큼 데이타를 읽는 형태입니다.
헌데 질문주시분은 그런것이 아니라 그냥 고정 100트를 사용하시나 보군요
요ㅤㄹㅕㅎ게 많이 하죠.
screen + vim + ctags 좋아요~
oops 통신 프로그램에서 단지 send/recv만 사용하는것은
oops
통신 프로그램에서 단지 send/recv만 사용하는것은 가끔 위험할때가 생깁니다. 그래서 몇가지 조합해서 사용하는데 그중 몇가지를 생각해볼수 있는데 먼저 가정을 해보죠.
1. send/recv는 모두 전송된/받은 양만큼 사이즈를 리턴 해준다.
2. send/recv는 보내거나 받을 양이 잘못될 경우 잘못하면 무한 블럭에 걸린다.
3. send/recv는 보내거나 받는곳의 디스크립터를 상실할 경우 SIGPIPE에 걸려서 프로그램이 강제 종료될수가 있다.
대충 이런정도인데요.
1번의 경우를 착안해서 send/recv로 별도의 프로그램을 만드시는것이 좋습니다. 즉, 내가 받아야할 사이즈가 얼마인데 현재 얼마 받았으니깐 받아야할 사이즈가 일치 할때 까지 LOOP을 돌려 본다.
2. 번의 경우 블락에 걸렸을때(대표적으로 RECV에서) 대처하는 방법인데 가장 손쉬운 방법은 SELECT를 사용해서 타임아웃을 주는 것입니다.
3.번의 경우 가장 쉽고 가장 정확한 방법은 SIGPIPE 시그널을 무시하게 만들어 주는것입니다.
1번의 예는 다른분이 올려 주신것을 확인해보세요.
즐거운 하루 되세요.
댓글 달기