[ CnUnix ] in KIDS 글 쓴 이(By): HellCat ((void*)0) 날 짜 (Date): 1994년04월12일(화) 13시40분44초 KST 제 목(Title): re: 쁘랑 select 보기 잠시 심심해서 끼적 거려 봐씀. 그러니 뿌랑 열심히 해서 채팅 디몽 하나 잘 만글어 봐요. /* * select() 와 물티플렉싱 보기.. */ fd_set readFDs, writeFDs, exceptionFDs; struct timeval timeout; /* 먼저 이니셜 라이즈 */ FD_ZERO (&readFDs); FD_ZERO (&writeFDs); FD_ZERO (&exceptionFDs); /* 만약 콘넥션 리퀘스트 들어 올때 대비에서.. */ if (listenSocket != -1) { FD_SET (listenSocket, &readFDs); } /* 그리고 현제 이미 성립된 콘넥션들을 쭈욱 다 흘터본다 */ for (con = conList.first; (con) && (con != (ConInfo *) & conList); con = conInfo->next) { switch (con->State) { case Pending: /* connection pending */ case In: /* ready to receive */ FD_SET (con->socket, &readFDs); break; case Out: /* some data to be sent */ FD_SET (con->socket, &writeFDs); break; default: /* no action required */ continue; } /* out of band event 를 해결 해야 한다 - expedited, disconnect ..etc */ FD_SET (con->socket, &exceptionFDs); } /* 얼마동안 select 가 기달리는지.. */ timeout.tv_sec = pollWaitTime / 1000; timeout.tv_usec = pollWaitTime % 1000; /* 주어진 타임아웃동안 죽치면서 체크 한다 - 그리고 만약 시그날로 */ /* 인해서 셀렉트가 타임아웃 되기전에 리턴 될때는 다시! */ errno = 0; while (((ret = select(MAXCON,&readFDs,&writeFDs,&exceptionFDs,&timeout))<0) && (errno == EINTR)); /* 윽...이럼 안되는데.. */ if (ret < 0) { perror("select"); return (-1); } /* 아무것도 없음 기냥 리턴 */ if (ret == 0) { return (0); } /* 누군가 콘넥트 하고 싶어 하는데..받아주던 거절하든 맘대로 .. */ if (listenSocket != -1 && FD_ISSET (listenSocket, &readFDs)) { ConIndicationEvent (); } /* 이미 성립된 콘넥션들을 줄줄이 돌아 가면서 그중 위의 select() 에서 */ 뭔가 있다고 해당사항 잇는거 잡아서 해결 한다 */ for (con = conList.first; (con) && (con != (ConInfo *) & conList); con = con->next) { /* OOB */ if (FD_ISSET (con->socket, &exceptionFDs)) { /* Out of Band 처리 */ Process_OOB_Event (con); /* 윗 이벤트 핸들 하다 짤라야 한다면 요건 놔두고 다음껄로 .. */ if (con->State == Aborted || con->state == Disconnected) { continue; } } /* 데이타 들어 왓음 */ if (FD_ISSET (con->socket, &readFDs)) { /* 들어온거 해결 .. */ Process_IN_Event (con); /* 윗 이벤트 핸들 하다 짤라야 한다면 요건 놔두고 다음껄로 .. */ if (con->State == Aborted || con->state == Disconnected) { continue; } } /* 보낼 데이타 있고 또 보낼 여건이 됨 */ if (FD_ISSET (con->socket, &writeFDs)) { /* 보낼꺼 보낸다 */ Process_OUT_Event (con); /* 윗 이벤트 핸들 하다 짤라야 한다면 요건 놔두고 다음껄로 .. */ if (con->State == Aborted || con->state == Disconnected) { continue; } } } /* 자 이제 위에서 일어 났을 지도 모르는 Abort 나 Disconnect 를 해결 */ for (con = conList.first; (con) && (con != (ConInfo *) & conList); con = con->next) { /* 짤렸거나 짤렸을때 .. */ if (con->State == Aborted || con->State == Disconnected) { /* 알아서 이벤트 핸들 한다 */ /* 이 콘넥션을 떨궈 내고.. */ deleteCon (con); /* 다음 껄로 이동 */ continue; } /* 요기선 이제 들어온 데이타나 또는 데이타 보낸후 뭔가 해결 해야 할 일들이 있을때 - 예를 들면 윗 layer 에 콘퍼메이션 올려 준다던지 또는 받은 데이타 프로세싱 한다던지..여러가지 이벤트 핸들 해도 됨 물론 프로그램 쓴 사람 맘대로 ....*/ } /* 성공! :) */ return (0); --- if (t_snddis(KIDS[i].fd, (struct t_call *)NULL) == -1) { t_error("날 죽여라!!"); longjmp ((jmp_buf) HELL, -1); } |