네트워크 프로그래밍에서 전송 싸이즈에 대해서...
글쓴이: zeshai / 작성시간: 화, 2003/12/23 - 12:53오후
안녕하세요. 간만에 글을 올리네요.
네트워크 프로그래밍을 많이 안짜봐서 이번에 좀 고생했는데.
그냥 간단하게 제가 구성한 structure를 보내고 받을때...
그 크기가 한 600바이트가 됩니다.
다른 작업없이 그냥 쏘고, 받고, 쏘고 받고 입니다.
아, 리눅스에서 작업했습니다.
그런데 제대로 전송되지가 않더라구요.
자세히 보니깐, 600바이트 한번가고 또 600바이트 한번 가는게 아니고...
만약 600바이트를 세번 보낸다고 가정하면,
600+600+300 (나머지 300바이트는 짤림) 이게 한번에 날아갑니다.
그리고 받는 쪽에서는 1500들어온것 중에서 600, 600, 300 이렇게 채우게 되구요.
MTU가 1500byte 이니 그때문에 걸리는것 같은데
왜 바로바로 날리지 않고, 저렇게 모았다가 쏩니까?
만약 10,000바이트 정도의 파일을 읽어서 보낸다고 하면...
어떻게 보내야하죠?
급한과제라... 그냥 나머지는 garbage로 채워서 1500맞추고
받는쪽에서도 600바이트 이외의 것은 무시하고... 내긴 냈습니다만...
뭐... tcp가 어쩌고 저쩌고하는거는 농담따먹기네요.
안해보니깐 고작 10,000바이트 파일도 전송 못하겠습니다.
raw 소켓을 열지 않고 바로바로 전송하지 못할리는 없을것 같은데요...
궁금하네요... 왜 그런지도 해결법도... 좀.... 부탁드립니다.
Forums:
int sockfd;/* tcp socket open */..
int sockfd;
/* tcp socket open */
.......
int optval = 1;
setsockopt(sockfd,IPPROTO_TCP,TCP_NODELAY,&optval,sizeof(optval));
한번 해 보세요...
그 옵션을 써도 뭉쳐 가거나 잘려서 가는 것을 방지할 수 없습니다.
그 옵션을 써도 뭉쳐 가거나 잘려서 가는 것을 방지할 수 없습니다.
출발지에서 아무리 잘 보낸다고 하더라도 받는 곳까지 가는 동안 수많은 라우터나 장비들을 거쳐가기 때문에 언제든지 분할/합침이 일어날 수 있습니다. 그리고 운좋게 제대로 도착했다고 하더라도 받는 쪽의 사정으로 합침이나 분할이 일어날 가능성도 충분히 있습니다.
이런 상황을 대비해서 자신만의 패킷구조를 만드시고 (예들들면, 데이터 안에서 안쓰거나 특별한 탈출코드로 패킷의 마지막을 나타내거나 크기 + 내용으로 보내거나 등) 정해진 패킷을 주고 받는 것이 올바른 방법이라고 생각합니다.
만약 주고받는 데이터 패킷의 크기가 일정하다면 한가지 옵션이 있습니다만... 이것은 조금 사용이 주저되는 것이라... recv 함수의 MSG_WAITALL 옵션으로 원하시는 기능을 사용할 수 있지만, 이것도 종료, 시그널 상황처리가 필요하고 데이터의 패킷이 추가된다면 (크기가 다른) 조금 어려운 상황이 될 것입니다.
댓글 달기