recvfrom()함수와 read()함수
글쓴이: Leejaymin / 작성시간: 목, 2009/11/05 - 6:16오후
안녕하세요
이번에 UDP를 이용해서 신뢰성을 보장하는 소켓통신을 구현하고잇는데요
클라이언트에서는 커넥션을 해서
read write 함수를 사용하고있는데
서버쪽에는 그게안되서
recvfrom() , sendto()를 사용하고있습니다.
근대 여기서 문제는
read 함수는 서버쪽에서 sendto()를 하지않으면 대기상태에 있는데
recvfrom()이 함수는 맨처음에는 대기상태에있다가
클라이언트에서 write하면 수행되더니
2번째부터는 클라이언트의 write가 없어도
게속 수행이되서 무한루프에 빠집니다.
버그과정 >
클라이언트 write 4바이트 전송
서버 recvfrom()으로 4바이트 수신 (받은크기 4라고 나옴)
서버 recvfrom() 계속해서 4바이트 수신 (받은크기 4라고나옴)
..
..
이런식으로 그냥 계속 받아집니다. 보낸건 1번인데...
recvfrom()에 인자로들어간 buf의 값은
test 라는 글자 맨처음에는 제대로 들어갔다가
recvfrom() 2번째부터 글자가 깨집니다.
제가 코딩과정중에 문제가 있어서 그런건지
아니면 recvfrom()이 read와 뭔가 많이 달라서 이러는건지 잘 모르겠습니다.
혹시 recvfrom()을 사용하면 이런문제가 발생하기 때문에 뭐 해줘야되는게 있는건가요?
제발 도와주세요 ㅜㅜ
감사합니다.
Forums:
UDP도 신뢰성을
UDP도 신뢰성을 보장하려면, TCP처럼 flow control과 congestion control을 구현해줘야 합니다.
congestion control은 그렇다쳐도 flow control은 되어야죠.
순서대로 보내고 받고 하는 메커니즘을 애플리케이션이 책임지고 제대로 구현해줘야 합니다.
그게 어렵다면 한 메시지에 대해서 한 번의 ACK 메시지를 보내주는 방식으로 동기화를
해주는 게 가장 간단합니다.
read/write와 sendto/recvfrom을 섞어서 사용하는 것은 그다지 추천하고 싶지 않네요.
일단 TCP/UDP에 대해서 제대로 이해하고 있는 사람도 그렇게 섞어쓰면 헷갈리고 실수할 수 밖에 없거든요.
sendto/recvfrom은 수행에 대한 성공/실패를 애플리케이션이 각각 처리해줘야 합니다. 반복적으로 부르면 어느 순간에는 성공할 거고, 어느 순간에는 실패할 겁니다. CPU 리소스 차원에서는 손해보는 짓이죠. 앞서 말한 것처럼 송신자와 수신자가 짝 맞춰서 메시지를 보내고 받는 방식으로 구현하셔야 안전하게 동작할 겁니다.
댓글 달기