소켓 프로그래밍 중 recv 기법에 대한 질문입니다.
글쓴이: lovejin0309 / 작성시간: 금, 2005/11/11 - 11:02오전
안녕하세요.
소켓 프로그래밍 중 데이터 수신 기법에 관한 질문입니다.
상대방이 보내 주는 데이터를 수신해야 하는데, 상대방이 데이터 송신을 끝냈다는 것을 어떻게 알 수 있을까요?
가령 예를 들어
상대방이 보내는 데이터의 크기가 512부터 1024까지 가변적일 경우에, 어떤 식으로 해야 가변적인 데이터 크기와 관계 없이 데이터를 수신할 수 있을 런지요?
소켓에 관련된 내용을 참조 해 보았는데, 소켓이 블럭킹 모드일 경우에는 소켓에 들어온 데이터가 없을 경우에는 계속 대기하고, 넌 블럭킹 모드일 경우에는 -1을 리턴한다고 나와 있는 것을 보았습니다.
recv_buf[64] 이고, recv 함수를 이용할 경우엔 어떻게 해야 하는지 조언 부탁 드립니다.
Forums:
프로토콜로 정의해야겠지요.http처럼 \r\n을 한 데이터의 끝을
프로토콜로 정의해야겠지요.
http처럼 \r\n을 한 데이터의 끝을 표현하는데 사용할 수 있고.
또는 프로토콜 구조를 정의하고( 헤더부를 두어 헤더에 앞으로 보낼 데이터의 크기를 메타정보로 보내고) 실제 데이터를 전송하는 방법이 있겠습니다.
tcp의 경우는 전송방식이 구조적인 데이터그램 방식이 아니라 단순한 바이
tcp의 경우는 전송방식이 구조적인 데이터그램 방식이 아니라 단순한 바이트 스트림이라서 사용자가 직접 데이터 전송 완료 시점을 상대방에게 알려주어야 합니다.
실제로 send함수를 이용해서 100바이트를 보낸다고 해서 상대방이 recv 호출 한번으로 100바이트를 받을 수는 없기 때문입니다.
수신측에서는 루프형식으로 계속 recv를 호출하여 데이터가 완전히 올때까지 받고나서 최종적으로 받은 데이터를 가지고 프로그램에서 쓸 수 있는 형태의 구조체 같은 것으로 변환해서 넘겨야 합니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
KLDP 위키에 보시면 아주 아주 고리 골짝전에 제가 만들어 올려놓은 통
KLDP 위키에 보시면 아주 아주 고리 골짝전에 제가 만들어 올려놓은 통신 FAQ가 있습니다. 그거를 한번 읽어 보시면 아주 아주 아주 쬐에에에에~~~끔은 도움이 되실겁니다.
먼저 염두에 두셔야할 부분은
1. TCP 통신은 데이터 송신을 보장합니다.
2. 하지만 언제라는 부분은 보장하지 않습니다.
이중 2번이 중요합니다. 송신측에서 10K를 보내자 마자 수신측에서 바로 10K 수신이 되지는 않습니다. 데이터가 잘리어 다른 경로를 타고 올수도 있고 여러 요인이 복합적으로 개입되게 됩니다.
따라서 데이터 송수신시에 수신측에서는 송신하려는 측이 데이터를 얼만큼 보내는지에 대해 알고 있어야만 합니다. 즉, 보내는 데이터 사이즈를 서로 알고 있어야 되는것입니다. HTTP의 경우 조금 특별한 방법이지만 바이너리 데이터의 경우 HTTP 헤더에 크기가 명시가 되고 일반 HTML 문서일 경우에는 접속 해제로서 데이터의 끝을 알려 주게 됩니다.
따라서 송신측에서 가변적으로 데이터를 보내는데 그 가변적인 데이터라는 부분을 수신측에서 알수가 없다면 그것은 잘못 만들어진 프로그램입니다. 데이터 부분이 가변적이라고 하면 데이터 헤더 부분(크기가 항상 일정한)을 만들어 이곳에 데이터 부분의 크기를 명시 해주는 방법도 있습니다.
데이터를 수신하는 방법에는 두가지 방법을 써볼수가 있습니다.
1. 특정한 시간동안만 읽어 보게 만든다.
2. 특정한 길이를 특정한 시간동안 읽어 보게 만들고 그 시간안에 그 길이 만큼 수신이 않되면 접속을 해제 하거나 버린다.
이런 식으로 써볼수가 있습니다. 1번의 경우 HTTP 데이터 부분을 수신할때 사용할수 있을겁니다.
통신 프로그램에 대해 빠르게 이해 하실려 하신다면 아주 빠른 방법이 있습니다. 개략적으로 통신 함수와 통신 프레임에 대해 이해를 하셨다면 소스 포지와 같은곳에 가셔서 간단한 통신 프로그램 위주로 한 10개만 다운받아서 통신 수신 루틴을 한번 보시면 놀랍게도 거의 90% 이상이 동일한 패턴으로 제작됨을 아실수 있을것이며 예외 처리에 대한것도 거의 동일 패턴으로 진행됨을 아실수 있을겁니다.
즐거운 하루 되세요.
댓글 달기