CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ 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); }
[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.