UDP 소켓 프로그래밍 질문
글쓴이: pcw919 / 작성시간: 일, 2010/04/25 - 4:11오전
하나의 프로그램으로 채팅하는것을 구현하고있는데요.
제가 어떤식으로 구현을 하였나 하면,
2개의 클래스를 선언하고 하나는 서버(bind) thread를 이용, 계속해서 유저가 말을 쓸수 있는게 만들었구요. (문자열받아 send)
나머지 하나의 클래스는 (connect)후, 지속적으로 recv만 하게 해놨습니다.
그러니 총 2개의 소켓이 이용되고있습니다.(받는,보내는)^^초짜라; 이방법이 생각나서요
그럼 문제점이 무었이냐하면, 문자열을 받아 send를 한후에 recv 쪽 함수가 3번돌아버리네요...
while(1)
{
strLen = recv(SocketS, messageS, BUFSIZE-1, 0);
messageS[strLen] = 0;
printf("message from Friend : %s \n", messageS);
}
recv쪽입니다... 이래서 뒤에
ZeroMemory로 메세지초기화도 해보았는데, 이상하게 이 while문이 3번이나 돌아버리면서 초기화된 (뒤에 ZeroMemory존재할때) messageS를
recv 받았던 그때로 되돌려버리네요...(예를들면 hello-> 출력 -> ZeroMemory-> 다시 hello로 부활 -> 출력 -> ZeroMemory 이런식으루요)
도무지 왜이런지 모르겠네요.
왜이런것일까요?
//c++ / winsock2 입니다.
Forums:
3번을 돌수도 있고
3번을 돌수도 있고 4번을 돌수도 있고 심지어 입력하신 문자열 길이만큼 반복될수도 있습니다.
UDP는 신뢰성이 없는 프로토콜입니다. 중복검사도 안해주며 순서도 보장하지 않으며 데이터가 정상적인
데이터라는 것도 보장 안해줍니다.
만약에 로컬에서 테스트 하시는 경우라면 다른 부분을 찾아봐야겠지만 만약에 실제 원격 네트워크에 연결되어있는
상태에서 테스트 하신거라면 충분히 발생할 수 있는 상황입니다.
로컬에서 테스트 하시는 경우라면 거의 문제가 발생하지 않습니다. recv가 리턴하는 값을 한번 확인해보세요.
recv가 리턴하는 값은 서버에서 send함수가 리턴하는 값과 같아야합니다. UDP는 TCP와 같이 쪼개들어오는 경우는
없으므로 확인 해보셔야 할 것 같습니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
그런데
잘몰라서 드리는 질문인데요.
recv함수의 4번째 파라미터 nflag 가 0일경우, queue 에 넣었다가 삭제시키면서 1회만 recv 받고
다음 recv를 기다려야 하는것 아닌가요?
send 함수쪽에서는 분명 send를 한후 다시 유저의 문자열입력코드쪽에서 대기하게 되는데,
저 위 본문의 recv함수쪽은 recv를 3번 받은마냥 돌아버리니...
댓글 달기