select()を使った送受信プログラム

  概要   プログラム   解説

プログラム

/**********************************************************************
   select.c : simple internet socket client program with select
   Jan 6,2001  copyright Takeshi FUJIKI (fujiki@fc-lab.com)
   POPサーバと通信するクライアントプログラム
***********************************************************************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define BUFLEN 1024
#define HOSTNAME "panda.local.fc-lab.com"

int main(int argc,char *argv[]) {
  struct hostent *host;     /* defined in /usr/include/netdb.h */
  struct sockaddr_in server;    /* defined in /usr/include/netinet/in.h */
  fd_set readmask;

  char buffer[BUFLEN];
  int s, option, n;
  u_short pop3_port = 110;
  char *p;

  bzero((char *)&server,sizeof(server));
  server.sin_family = AF_INET;
  /*  server.sin_port = htons(pop3_port); */
  server.sin_port = htons(110);

  /* ホスト名によるサーバアドレスの設定 */
  host = gethostbyname(HOSTNAME);
  bcopy(host->h_addr,(char *)&server.sin_addr,host->h_length);

  s = socket(AF_INET,SOCK_STREAM,0);
  connect(s,&server,sizeof(server));

  FD_ZERO(&readmask);
  do {
    /* FD_SETでセットしたfile descripterに関して入力をワッチする */
    FD_SET(0,&readmask);
    FD_SET(s,&readmask);

    /* 入力があるとselect()はreadmaskに入力元の情報を入れ終了する */
    select(s+1,&readmask,NULL,NULL,NULL);

    if (FD_ISSET(0,&readmask)) { /* consoleから入力があった場合 */
      n = read(0,buffer,BUFLEN);
      /* readでコンソールから入力では改行コードは\nしか入らない */
      buffer[n-1]='\r';
      buffer[n]='\n';
      write(s,buffer,n+1);
    } else if (FD_ISSET(s,&readmask)) { /* socketから入力があった場合 */
      n = read(s,buffer,BUFLEN);
      write(0,buffer,n);
    } 
  } while(strncmp(buffer,"quit",4));
}
FC Labのホームへ 「ネットワークプログラミング」のページへ