::: 강좌/소스/문서 :::

강좌/소스/문서 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2003-07-29 13:34:16, Hit : 6838, Vote : 1571
 [소스] 비동기 timeout read()/write()

/******************************************************************************
  CP_read_timeout()
    .read() 의 비동기 timeout 버전
    .parameter:
       skt: 읽을 소켓
       recv_buf: 읽을 자료를 저장할 위치
       nbytes: 읽을 바이트수
       waites: 대기시간(sec.)
    .return:
       0: success
       other: 읽은 바이트수
    .작성자: 김영대( http://www.howto.pe.kr )
******************************************************************************/
int CP_read_timeout(int skt,
                    char *recv_buf,
                    int nbytes,
                    int waits) {
  struct timeval tv = {waits, 0};                      
  fd_set selectfds, readfds, exceptfds; /* 읽기 감지할 소켓번호 구조체 */
  int nleft, nread;

  /* skt 를 fd_set 에 등록한다. */
  FD_ZERO(&selectfds);
  FD_SET(skt, &selectfds);
  readfds   = selectfds;
  exceptfds = selectfds;

  if (select(skt+1, &readfds, (fd_set *)0, &exceptfds, &tv) <= 0) /* error 또는 time out */
    return -1;
  else if (FD_ISSET(skt, &exceptfds)) /* error 또는 time out */
    return -1;
              
  nleft = nbytes;
  while (nleft > 0) {
    nread = read(skt, recv_buf, nleft);
    if (nread < 0) {
     if (errno == EINTR)
       continue;
     if (errno == EAGAIN) {
       readfds   = selectfds;
       exceptfds = selectfds;

       if (select(skt+1, &readfds, (fd_set *)0, &exceptfds, &tv) <= 0) /* error 또는 time out */
         return -1;
       else if (FD_ISSET(skt, &exceptfds)) /* error 또는 time out */
         return -1;
        
       continue;
     }    
    } else if (nread == 0) /* EOF */
      break;
            
    nleft = nleft - nread;
    recv_buf = recv_buf + nread;
  }
  
  return (nbytes - nleft);          
}

/******************************************************************************
  CP_write_timeout()
    .write() 의 비동기 timeout 버전
    .parameter:
       skt: 쓰기할 소켓
       send_buf: 쓰기할 자료가 저장된 위치
       nbytes: 쓰기할 바이트수
       waites: 대기시간(sec.)
    .return:
       0: success
       other: 쓴 바이트수
    .작성자: 김영대( http://www.howto.pe.kr )
******************************************************************************/
int CP_write_timeout(int skt,
                     char *send_buf,
                     int nbytes,
                     int waits) {
  struct timeval tv = {waits, 0};                      
  fd_set selectfds, writefds, exceptfds; /* 쓰기 감지할 소켓번호 구조체 */
  int nleft, nwritten;
                        
  /* skt 를 fd_set 에 등록한다. */
  FD_ZERO(&selectfds);
  FD_SET(skt, &selectfds);
  writefds  = selectfds;
  exceptfds = selectfds;

  if (select(skt+1, (fd_set *)0, &writefds, &exceptfds, &tv) <= 0) /* error 또는 time out */
    return -1;
  else if (FD_ISSET(skt, &exceptfds)) /* error 또는 time out */
    return -1;

  nleft = nbytes;
  while (nleft > 0) {
    nwritten = write(skt, send_buf, nleft);
    if (nwritten < 0) {
      if (errno == EINTR)
        continue;
      if (errno == EAGAIN) {
        writefds  = selectfds;
        exceptfds = selectfds;

        if (select(skt+1, (fd_set *)0, &writefds, &exceptfds, &tv) <= 0) /* error 또는 time out */
          return -1;
        else if (FD_ISSET(skt, &exceptfds)) /* error 또는 time out */
          return -1;
          
        continue;
      }    
    }
            
    nleft = nleft - nwritten;
    send_buf = send_buf + nwritten;
  }
  
  return (nbytes - nleft);
}





8   [네트워크/보안] [참고] TCP 에서 사용되는 효율향상 알고리즘  김영대 2004/07/16 9624 1912
7   [네트워크/보안] [참고] TCP 에서 사용되는 내부 타이머  김영대 2004/07/13 9482 1761
6   [네트워크/보안] [강좌] ucd-snmp 설치  김영대 2003/11/29 8169 1607
  [네트워크/보안] [소스] 비동기 timeout read()/write()  김영대 2003/07/29 6838 1571
4   [네트워크/보안] [참고] 다중연결(multiple sockets) 서버의 구현방법 종류  김영대 2003/07/17 9865 2063
3   [네트워크/보안] [소스] 멀티캐스트를 이용한 채팅 프로그램  김영대 2003/03/19 10051 1903
2   [네트워크/보안] [소스] 간단한 채팅 클라이언트/서버  김영대 2003/03/13 10897 1707
1   [네트워크/보안] [소스] Multi Chatting Server  김영대 2003/03/12 7481 1599

1
 

Copyright 1999-2017 Zeroboard / skin by zero