소켓으로 데이터 전송시 문제점
글쓴이: renige / 작성시간: 일, 2003/12/28 - 11:35오후
안녕하십니까..
TCP 소켓으로 한 5M정도를 1024씩 잘라서 보내려고 합니다. 1024크기 패킷의 처음한 바이트는 패킷타입으로 사용하여 이 값을 보고 패킷을 처리합니다.
그런데 아무런 delay없이 보낼 경우, 처음에 10개정도는 패킷타입이 제대로 된 값이 들어가는데, 그 이후 부터 패킷타입값이 다른 값이 들어갑니다.
그래서 delay를 주고 보내면 제대로된 패킷값이 제대로 들어가서 받는 측에서는 제대로 받고 처리합니다.
select를 이용하여 소켓에서 데이터를 받았을 경우 처리합니다.
보내는 측은 출력해봐서 아무런 이상이 없는 상태입니다.
받는 측에서 처리하는 시간동안 패킷을 받지 못하는 것 같습니다.
이 문제점을 해결할 방법을 알고 싶습니다.
수고하십시요
Forums:
Re: 소켓으로 데이터 전송시 문제점
정확한 원인은 올려주신 정보로만은 판별이 불가능한것 같습니다.
추측을 하나 하자면, read, write할때 데이터 전송 량을 제대로 체크하지
못해서 생기는 문제인것 같습니다. 직접 코드를 봐야 알겠지만
왠지 그런느낌이 드는군요.
즉, write할때 write(fd, buff, 1024)라고 하여도 정확하게 1024바이트가
write되는것은 아니기 때문에 얼마를 write하였는지 check하여 나머지를
subtract해서 다시 보내야 하지요.
고속으로 보내면 문제가 생기고 그렇지 않으면 문제가 생기지 않는다고
하시는걸 보니, 왠지 그런것 같습니다. 커널 버퍼가 꽉차면 무조건 유저영역의
데이터를 받아들일수가 없으니까요. 확인해보시고 그것도 아니라면
좀더 많은 정보를 주셨으면 하네요 ^^
그럼 즐거운 하루되세요~
@.@ 어제처럼, 오늘 처럼, 내일 처럼.
정확한 답변은 아닙니다만...
흔히 생각하기에 주고 받고, 주고 받고 하면 잘 되겠지라고 생각하시지만...
그렇게 네트워크 전송은 신뢰도가 높은것이 아니더군요.
자신만의 프로토콜을 디자인해서 적어도 structure로 제대로 온 값인지를
구별할 수 있는 변수를 하나 두는 것이 좋습니다.
또한 윗분이 적으신것 처럼....
넘겨준 사이즈 만큼 제대로 받았는지도 잘 확인해야합니다.
명시적으로 잘 왔으면 왔다고 메세지를 보내주고 아니라면 다시 받고...
이런식으로 하면 그나마 잘 되더군요...
버퍼의 관리와 사이즈의 측정이 아주 중요한것 같습니다.
별로 도움이 되지 못한것 같군요.. :-)
음...질문내용이 불 명확하군요
수신 쪽에서 아예 데이타를 못 받는 다는 소리이신가요?
아니면, 받긴 받는데, 잘 못 받는 것 같다는 말씀이신가요?
쓰레기는 쓰레기통에...
우선 TCP/IP 전송은 신뢰할만 합니다 ^^;테이터수신부가 Wi
우선 TCP/IP 전송은 신뢰할만 합니다 ^^;
테이터수신부가 Windows의 경우에는
페킷크기나, 넷웍상황에 따라
fregmet 발생합니다.
Queue로 구성하셔서.. 데이터를 어느정도
조립하셔야만 정확한 데이터를
받으실수 있으실 것 같습니다.
오해하실 것 같아서...
제가 말한 신뢰성 얘기는 그냥 책으로만 공부한 사람들이 실제 구현을 했을때...
느낌을 얘기한 것입니다.
물론 저도 포함되지요...
TCP/IP가 어느정도의 신뢰성도 없었다면...
저희가 여기서 이렇게 얘기를 나누고 있진 않겠죠? ;-)
여기를 참고하세요.
똑같은 질문을 몇주전에 누구한테 들었는데....^^
제 생각은 맨 윗분 말씀대로 tcp버퍼가 넘처서 write를 다 못한것 같기도 하고... 아니면.. recv하실때... 실수 하신것 같군요...
여기를 참고해보세요.
http://abyss.jaram.org/wiki/wiki.php/EffectiveTcp/ipProgramming#s-1.6
이팩티브 tcp/ip프로그래밍 책보면서 정리한건데 저 부분을 보면 도움이 되실것 같네요.
댓글 달기