recv()
send()
recv()
send()
recv()
send()
send()
recv()
recv()
send()
send()
recv()

    1  /*
    2   * POP3 client program
    3   * mailp.c
    4   * cc mailp.c -lnsl -o mailp
    5   */
    6
    7  #include 
    8  #include 
    9  #include 
   10  #include 
   11  #include 
   12  #include 
   13  #include 
   14  #include 
   15
   16  #define  BUFMAX  256
   17  #define  PORT_NO 110
   18
   19  void read_msg();
   20  void print_err(char *);
   21
   22  extern int h_errno;
   23  int net;
   24  int nbyte;
   25  char r_msg[BUFMAX];
   26  char s_msg[BUFMAX];
   27  char input[6];
   28
   29  int
   30  main(int argc, char *argv[])
   31  {
   32      struct hostent *host;
   33      struct servent *serv;
   34      struct sockaddr_in sa;
   35      char p_list[] = "LIST\n";
   36      char p_user[] = "USER pop_user\n";
   37      char p_pass[] = "PASS pop_password\n";
   38      char p_quit[] = "QUIT\n";
   39
   40      if (argc != 2) {
   41          printf("Usage: %s hostname\n", argv[0]);
   42          exit(1);
   43      }
   44
   45      /*
   46       * Check Host name
   47       */
   48      if ((host = gethostbyname(argv[1])) == NULL){
   49          herror("gethostbyname()");
   50          close(net);
   51          exit(1);
   52      }
   53
   54      memset(&sa,0, sizeof(struct sockaddr_in));
   55      memcpy(&sa.sin_addr, host->h_addr, sizeof(struct in_addr));
   56
   57      sa.sin_family = AF_INET;
   58      sa.sin_port = htons(PORT_NO);
   59
   60      /*
   61       * Make socket
   62       */
   63      if((net = socket(AF_INET, SOCK_STREAM, 0)) < 0)
   64          print_err("socket()");
   65
   66      /*
   67       * Connect to the mail server
   68       */
   69      if (connect(net, (struct sockaddr *)&sa, sizeof(struct sockaddr)) < 0)
   70          print_err("connect()");
   71
   72      /*
   73       * Receive connection messages from server
   74       */
   75      memset(r_msg,0,BUFMAX);
   76      if( recv(net,r_msg,BUFMAX,0) < 0)
   77          print_err("recv()");
   78      printf("%s",r_msg);
   79
   80      /*
   81       * Send user name
   82       */
   83      nbyte = strlen( p_user );
   84      if( send(net,p_user,nbyte,0) < 0)
   85          print_err("send()");
   86
   87      memset(r_msg,0,BUFMAX);
   88      if( recv(net,r_msg,BUFMAX,0) < 0)
   89          print_err("recv");
   90      printf("%s",r_msg);
   91
   92      /*
   93       * Send password
   94       */
   95      nbyte = strlen(p_pass);
   96      if( send(net,p_pass,nbyte,0) < 0 )
   97          print_err("send()");
   98
   99      memset(r_msg,0,BUFMAX);
  100      if( recv(net,r_msg,BUFMAX,0) < 0)
  101          print_err("recv()");
  102      printf("%s",r_msg);
  103
  104      /*
  105       * Request mail list & Select letter number
  106       */
  107      while(1){  /* loop start */
  108          nbyte = strlen( p_list );
  109          if( send(net,p_list,nbyte,0) < 0 )
  110              print_err("send()");
  111          while(1){
  112              memset(r_msg,0,BUFMAX);
  113              if( recv(net,r_msg,BUFMAX,0) < 0)
  114                  print_err("recv()");
  115              printf("%s",r_msg);
  116              if ( strstr( r_msg, "\n.") !=  NULL) {
  117                  printf("\n");
  118                  break;
  119              }
  120          }
  121
  122          /*
  123           * Enter letter number
  124           */
  125          printf("Enter the number you want to read( q for quit)\n");
  126          if ( scanf("%5s", input) < 0)
  127              print_err("scanf()");
  128
  129          if ( input[0] == 'q' ) {
  130              nbyte = strlen( p_quit );
  131              if( send(net,p_quit,nbyte,0) < 0)
  132                  print_err("send()");
  133              memset(r_msg,0,BUFMAX);
  134              if( recv(net,r_msg,BUFMAX,0) < 0)
  135                  print_err("recv()");
  136              printf("%s\n",r_msg);
  137              /* Normal closure process */
  138              if (shutdown(net, 2) < 0)
  139                  print_err("shutdown()");
  140              close(net);
  141              exit(0);
  142          }
  143          if( (isdigit(input[0])) == 0){
  144              printf("Input error\n");
  145              continue;
  146          }
  147          read_msg();
  148      } /* loop end */
  149  }
  150
  151  /*********************************************************
  152   *  read_msg()
  153   *
  154   *  Retrieve and print email message from the mail server
  155   *********************************************************/
  156  void
  157  read_msg()
  158  {
  159      sprintf(s_msg,"RETR %s\n",input);
  160      nbyte = strlen(s_msg);
  161      if( send(net,s_msg,nbyte,0) < 0 )
  162          print_err("send()");
  163      while(1){
  164          memset(r_msg,0,BUFMAX);
  165          if( recv(net,r_msg,BUFMAX,0) < 0)
  166              print_err("recv()");
  167          printf("%s",r_msg);
  168          if( strstr(r_msg,"\n.") != NULL ){
  169              printf("\n");
  170              break;
  171          }
  172      }
  173      return;
  174  }
  175
  176  void
  177  print_err(char *func)
  178  {
  179      perror(func);
  180      close(net);
  181      exit(1);
  182  }

mailp.c

% ./mailp mail.example.com
+OK POP3 mail v2001.80 server ready
+OK User name accepted, password please
+OK Mailbox open, 2 messages
+OK Mailbox scan listing follows
1 392
2 395
.

Enter the number you want to read.( q for quit)
1
+OK 392 octets					     
Return-Path: <root><root@mail.example.com>	     
Received: (from root@localhost)			     
by mail.example.com (8.8.7/8.8.7) id AAA21525	     
for pop_user; Thu, 1 Jul 1999 00:24:05 +0900	     
Date: Thu, 1 Jul 1999 00:24:05 +0900		     
From: root					     
Message-Id: <199906301524.AAA21525@mail.example.com> 
To: pop_user@mail.example.com			     
Subject: test1					     
X-UIDL: 0beb13dbeab34ae6e3549b3f5ea2872c	     
Status: RO					     
						     
This is a test mail from root.			     
Can you read?					     
.						     
						     
+OK 2 messages (787 octets)			     
1 392						     
2 395						     
.						     
						     
Enter the number you want to read( q for quit)	     
q						     
+OK Sayonara                                         

   40      if (argc != 2) {
   41          printf("Usage: %s hostname\n", argv[0]);
   42          exit(1);
   43      }
   48      if ((host = gethostbyname(argv[1])) == NULL){
   49          herror("gethostbyname()");
   50          close(net);
   51          exit(1);
   52      }
gethostbyname()
#include <netdb.h>
struct hostent *gethostbyname(const char *name);

   54      memset(&sa,0, sizeof(struct sockaddr_in));


   80      /*
   81       * Send user name
   82       */
   83      nbyte = strlen( p_user );
   84      if( send(net,p_user,nbyte,0) < 0)
   85          print_err("send()");
   86
   87      memset(r_msg,0,BUFMAX);
   88      if( recv(net,r_msg,BUFMAX,0) < 0)
   89          print_err("recv");
   90      printf("%s",r_msg);


send()
#include <sys/types.h>
#include <sys/socket.h>
int send(int s, const void *msg, int len, unsigned int flags);



recv()
#include <sys/types.h>
#include <sys/socket.h>
int recv(int s, void *msg, int len, unsigned int flags);



  104      /*
  105       * Request mail list & Select letter number
  106       */
  107      while(1){  /* loop start */
  108          nbyte = strlen( p_list );
  109          if( send(net,p_list,nbyte,0) < 0 )
  110              print_err("send()");
  111          while(1){
  112              memset(r_msg,0,BUFMAX);
  113              if( recv(net,r_msg,BUFMAX,0) < 0)
  114                  print_err("recv()");
  115              printf("%s",r_msg);
  116              if ( strstr( r_msg, "\n.") !=  NULL) {
  117                  printf("\n");
  118                  break;
  119              }
  120          }


  122          /*
  123           * Enter letter number
  124           */
  125          printf("Enter the number you want to read( q for quit)\n");
  126          if ( scanf("%5s", input) < 0)
  127              print_err("scanf()");
  128
  129          if ( input[0] == 'q' ) {
  130              nbyte = strlen( p_quit );
  131              if( send(net,p_quit,nbyte,0) < 0)
  132                  print_err("send()");
  133              memset(r_msg,0,BUFMAX);
  134              if( recv(net,r_msg,BUFMAX,0) < 0)
  135                  print_err("recv()");
  136              printf("%s\n",r_msg);
  137              /* Normal closure process */
  138              if (shutdown(net, 2) < 0)
  139                  print_err("shutdown()");
  140              close(net);
  141              exit(0);
  142          }
  143          if( (isdigit(input[0])) == 0){
  144              printf("Input error\n");
  145              continue;
  146          }


  143          if( (isdigit(input[0])) == 0){
  144              printf("Input error\n");
  145              continue;
  146          }
  147          read_msg();
  156  void
  157  read_msg()
  158  {
  159      sprintf(s_msg,"RETR %s\n",input);
  160      nbyte = strlen(s_msg);
  161      if( send(net,s_msg,nbyte,0) < 0 )
  162          print_err("send()");
  163      while(1){
  164          memset(r_msg,0,BUFMAX);
  165          if( recv(net,r_msg,BUFMAX,0) < 0)
  166              print_err("recv()");
  167          printf("%s",r_msg);
  168          if( strstr(r_msg,"\n.") != NULL ){
  169              printf("\n");
  170              break;
  171          }
  172      }
  173      return;
  174  }




トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS