|
if(받은 데이터가 있으면)
이 처리를 어떻게 해주셨냐에 따라서 결과가 틀려질 수 있을것 같네요.
아마도, select 를 이용해서 전부 다 긁어보신다음 마지막
연결 핸들로 데이터 여부를 판단하시지 않았나 싶습니다.. :D
보통은.. 아래와 같이 움직입니다.
fd_set fdSockCheck;
int itCount, itTemp, itReadBytes, itAddressLength, itPlayer;
static struct timeval ssTime = {0L, 5000L};
struct sockaddr_in siAddress;
char caQueue[QUEUESIZE + 1];
// UDP 처리 때문에 Read 딜레이를 두지 않음
ssTime.tv_usec = 5000L;
itAddressLength = sizeof(siAddress);
fdSockCheck = fdSockets;
if(select(TABLESIZE, &fdSockCheck, 0, 0, &ssTime) > 0) {
itReadBytes = recvfrom(UDPSocket, BUFFER, IBUFSIZE, 0, (struct sockaddr*)&siAddress, &itAddressLength);
if(itReadBytes >= 1) {
... 읽기 처리 루틴 ...
}
}
return(0);
박기홍 님이 쓰신 글 :
: 또 이런 초보적인 질문을 합니다..
: 이해가 안가는 부분이 있어서 인데요..
:
: 아주 간단하게 c/s 프로그램을 만들었습니다.
: 쓰레드를 이용해서 여러명이 접속도 가능하게 했구요..
:
: 제가 궁금한것은.. 서버에서
:
: accpet 부분을 쓰레드 안에서 시행하게 했습니다.
: 그리고 accept에 성공하면
: 또 다른 쓰레드로 recv()를 돌려서 클라이언트에게
: 받은 메시지가 있으면 메시지 박스를 띄었구요..
: 아래를 보시면 이해가 더 빠르실거에요..
:
: [[ thread1 ]]
: for(;;) {
: if( accept성공 )
: {
: MessageBox(접속성공);
: thread2 호출;
: }
: }
:
: [[ thread2 ]]
: for(;;) {
: if( 받은데이터가 있으면)
: {
: MessageBox(받은데이터 출력);
: }
: }
:
:
: 이런 식으로 했는데..
: 클라이언트 프로그램을 여러개 띄어놓고 테스트를 해보면..
: 클라이언트들이 접속할때마다 서버에서는 "접속성공"이라는 메시지를 보여줍니다.
:
: 하지만 클라이언트의 (테스트용으로 만든) 메시지를 보내기 버튼을 누르면
: 마지막에 접속에 성공한 클라이언트의 메시지만 뿌려주고요..
: 그 전에 접속해있던 클라이언트의 메시지보내기버튼을 누르면 아무 반응도 안하더군요..
:
:
: 제가 생각할때는 이런식으로 하면 당연히 될줄 알았는데.. -_-;;
: 항상 도움만 받아서 죄송합니다~
:
: 방법에 문제가 있다거나 하는 부분을 가르쳐주시면 감사하겠습니다. ^^
|