TCP 통신에서 정확한 length 전송/받기
글쓴이: webispy / 작성시간: 목, 2007/09/06 - 8:12오후
안녕하세요.
TCP방식을 통해서 데이터를 주고받으려고 하는데, 궁금한 점이 있어서 질문을 드립니다.
1. 보내는 쪽에서
100 Bytes
200 Bytes
300 Bytes
위의 3개의 데이터를 순서대로 보냈을 경우(각각 send, 총 3번 send 수행)
2. 받는 쪽에서
100 Bytes
200 Bytes
300 Bytes
3개의 데이터를 순서대로 recv 3번으로 받을 수 있나요? (정확히 3번 recv 수행으로 받을 수 있는지)
네트워크 상황에 따라 쪼개져서 전송되거나 하는 상황은 발생하지 않는건가요? 만약 발생한다면 쉽게 해결할 수 있는 방법이 있는지 알고 싶습니다.
Forums:
쪼개져서 전송되는
쪼개져서 전송되는 경우도 있습니다.
그래서 애플리케이션 수준에서도 length 같은 정보를
일종의 헤더를 만들어서 전송해주게 되지요. ;;
일단 length만 넘어오면 그 다음부터는
그 length만큼 다 넘어올 때까지 read를 반복하면 되겠죠.
TCP에서는
TCP에서는 stream을 제공할 뿐이므로 3번 보냈다고 해서 정확히 3번만에 읽을 수 없습니다.
위의 100, 200, 300을 순차적으로 짧은 시간에 보냈다면,
nagle's algorithm에 의해 한번에 받을 확률이 높습니다.
윗분 말씀처럼 length가 포함된 header를 사용하는 경우가 일반적이지만, 이 경우도 정확히
3번만에 읽는다는 것을 보장하지는 못합니다.(header를 읽는 것을 제외한다고 하더라도 말이죠.)
I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?
쉽게 해결할 수 있는
쉽게 해결할 수 있는 방법... 없습니다.
어렵게 해결할 수 있는 방법도 제가 아는 한 없습니다.
Length를 미리 넘겨주고, 읽는 쪽에서 그만큼 읽어야 합니다.
Read를 두번 (length 때문에 한번, 실제 데이터를 위해 한번) 하는 overhead를 막기 위해서는 buffer를 두고 최대한 읽을만큼 읽은 다음 원하는 length만큼 읽었으면 통과하고 나머지는 다음 번 read를 위해 남겨두는 등의 삽질이 필요합니다.
ioctl을 사용하면...
ioctl을 사용하면 될 것 같네요..
쪼개져서 전송되어도 버퍼에 차곡차곡 저장이 될테고, 버퍼에 저장된 바이트만 알면,
recv를 정확히 3번 콜할 수 있을 것 같네요..
물론 저는 그렇게 안씁니다. 윗분들 얘기처럼 보낼 데이터 길이와 ioctl을 같이 쓰죠.. ^^;
저도 초보자인데요^^
먼저 length의 길이를 전송 해준다고 했는데
unsigned short recv_lens; //받을 데이터 길이 저장 버퍼
memset(&recv_buff,0x00,sizeof(recv_buff));
recv(inet_sock,recv_lens,2,0);
recv(inet_sock,recv_buff,recv_lens,0);
위와 같은 방식으로 받으면 되나요??
클라이언트는
send(clnt_socket,strlen(snd_buff),2,0);
send(clnt_socket,snd_buff,strlen(snd_buff),0);
이렇게 구성하였습니다.
근데 제가 send_buff에 "1111csm001"으로 초기화 해놓고 보냈는데.
59라고 나오네요.ㅠ.ㅠ 아시는분 리플좀 부탁 드릴게요
댓글 달기