[완료][질문] 소켓 프로그래밍에서 write()와 read()가 1 : 1 이 아닌가요?
글쓴이: sDH8988L / 작성시간: 화, 2007/09/18 - 9:32오전
안녕하십니까...
지금 소켓 프로그래밍을 처음 하고 있는데요...
흠... 파일 Upload / download 부분에서 좀 이해 안가는 문제가 있네요...
write() / read() 로 upload / download를 구현하고 있는데, 이게 1 : 1 대응이 아닌가요?
달리 말하자면, 100M 짜리 파일은 1K 단위로 보내는데, 만일 1 : 1 대응이 아니라면, 보내는 측에서야 언제 파일이 끝나는 지는 알 수 있겠으나 받는 쪽에서는 알 수 없는 것 아니겠습니까?
Test를 하나 해 봤는데, write()를 Loop를 돌면서 100 x 1024번 할 때, read()는 그 수 만큼 실행되지 않습니다... 대체적으로 더 많이 실행 되더군요... 정확히 1K씩 받는 것도 아니고 덜 받을 때가 많아서 전체적으로 write() 보다 read() 실행 수가 많습니다...
이러면, 언제 upload가 끝나는지 알 수 없는 거 아닐까요?
처음 생각은 보내는 측에서 어떤 종료 Message를 보내서 그걸 받는 측이 받으면, download loop를 빠지는 걸로 설계햇었는데요...
그 종료 Message가 그 이전의 Data Message랑 섞여 버리더군요... 이걸 어찌 해야 하는지...
아시는 분 계시면 좀 답변 부탁드리겠습니다...
Forums:
Re: TCP 의 특성입니다
자세한것은 TCP 를 이론적으로 알아보시면 자세히 알 수 있을 것입니다..
질문하신 상황과 같은 경우에는,
보통 파일을 보내는 측에서 파일의 사이즈를 먼저 보내고 실제 데이터를 보내는
방식으로 많이 구현합니다.
감사합니다... 가르쳐
감사합니다...
가르쳐 주신 방법으로 파일 Upload를 구현하였습니다...
이 문제로 Class Project를 못 할 위기에 있었는데, kslee80님 덕분에 살았습니다...
다시 한 번 감사드립니다...
혹 또 모르는 일이 있으면 종종 질문 드리겠습니다...
sDH8988L 씀: write()를
write와 read는 1:1 매칭이 아닙니다. read 했을 경우에 return값은 해당 buffer에 실제로 read한 양의 값을 return하도록 되어 있는 이유가 바로 이러한 부분을 체크하라고
값을 return해주는 것입니다. 실제로 1024 buffer를 사용하셔서 read를 한다고 하더라도, 100% 1024를 항상 receive 하지는 않습니다. 이보다 적은 데이터를 return할 가능성은 충분히 있음을 생각하셔야 합니다. 단, recv()에서 flag에 MSG_WAITALL 이라는 option을 사용하시면, 원하시는 기능을 사용가능하니 manual page를 확인하시면 될거 같습니다.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
흠...
흠... 그렇군요...
소켓 프로그래밍을 이제 시작하다 보니 모르는 게 많습니다...
가르쳐 주신 recv() option을 사용해 보았습니다... 잘 동작하는 군요...
많은 걸 배웁니다...
감사합니다...
댓글 달기