www.pudn.com > DTMS.rar > CLIPROG.C


#include
#include
#include
#include    /* function atoi() */
#include
#include
#include   /*function char* getpass(const char*)   */
#include
#include
#include

#define MAXSIZE 500
#define OK 1

typedef struct{
           int mailnum;
           char to[MAXSIZE];
           char from[MAXSIZE];
           char subject[MAXSIZE];
           char content[MAXSIZE];
}MailStruct;

/*
   Signals meaning: 
   B:Begin,D:Done,T:True,F:False
*/

int ConnectToServer(char *,char*);
int ClientMain(int);

char InterfaceA();
int SendSockChar(int ,char);
char GetSockChar(int);
int sockendline();
void  CutEndl(char* str);
int readline (int,void *,int);

void InputUsrPswdR(char*,char*);
void InputUsrPswdL(char*,char*);
int SendUsrPswd(int ,char* ,char*);
int RegisterCli(int );
int MailClient(int );

int ReadMailCli(int);
int DelMailCli(int);
int SendMailCli(int);

int main(int argc,char **argv)
{
    int sockfd;

    if (argc!=3) {
        fprintf(stderr,"usage:./cliprog\n");         
        exit(1);
    }
    
    sockfd=ConnectToServer(argv[1],argv[2]);
    
    ClientMain(sockfd);
    
    close(sockfd);
    printf("......local socket closed\n");
    return 0;
}
  
int ConnectToServer(char* IpAddr,char* SevPort)   /*ok*/ 
{
     int sockfd;
     struct sockaddr_in servaddr;
     sockfd=socket(AF_INET,SOCK_STREAM,0);
     bzero(&servaddr,sizeof(struct sockaddr_in));
     servaddr.sin_family=AF_INET;
     servaddr.sin_port=htons(atoi(SevPort));
     inet_aton(IpAddr,&servaddr.sin_addr);
     connect(sockfd,(struct sockaddr*)&servaddr,sizeof(struct sockaddr));
     return sockfd;
}

int ClientMain(int sockfd)    /*ok*/
{
    char Comch,Infch;
    char recvbuf[MAXSIZE],sendbuf[MAXSIZE];

    Comch=InterfaceA();
    SendSockChar(sockfd,Comch);
    switch (Comch){
        case 'R':
                RegisterCli(sockfd);
                 break;
        case 'L':
                 LoginCli(sockfd);
                  break;
    }
}

int SendSockChar(int sockfd,char ch)    /*ok*/
/*send a signal char or a  command char to server through socket*/
{
    return write(sockfd,&ch,1);
}

char GetSockChar(int sockfd)      /*ok*/
/*get a command char  or a signal char from socket*/
{
    char ch;
    while ( (read(sockfd,&ch,1))==0);
    return ch;
} 

char InterfaceA()     /*ok*/
{
    char ch;
    printf("\n\nWelcome to DTMail system!\n");
    printf("Version 1.0,  Written by Tang Wei & Tang Zhijun\n");
    printf("Supervisor: Shen Mingyu\n");
    printf("June 9,2002\n");
    printf("\nPlease input your choice:R or L?\n");         
    printf("[R]egesiter\n");     
    printf("[L]ogin\n");  
    do {
             ch=getchar();
             ch=toupper(ch);
              if (ch!='R'&&ch!='L')
                  printf("No such choice,please enter again,R or L:");
    }while(ch!='R'&&ch!='L');
    return ch;
}

int RegisterCli(int sockfd)    /*ok*/
{
    char ch;
    char Username[MAXSIZE],Password[MAXSIZE];
    InputUsrPswdR(Username,Password);
    SendUsrPswd(sockfd,Username,Password);
    if ((ch=GetSockChar(sockfd))=='D')
           printf("Register Successfully!\n");
    return OK;
}
int LoginCli(int sockfd)
{
    char ret;
    char Username[MAXSIZE],Password[MAXSIZE];
    do {
        InputUsrPswdL(Username,Password);
        SendUsrPswd(sockfd,Username,Password);
        while(read(sockfd,&ret,1)==0);
        if  (ret=='T')
            MailClient(sockfd);
        else
            printf("Password wrong,please input again\n");
    }while (ret=='F');
    return OK;
}
void InputUsrPswdL(char *Usr,char*Pswd)   /*ok*/
{
    char *ptr;
    puts("please input username:");
    scanf("%s",Usr);
    ptr = getpass("please input password:");
    strcpy(Pswd,ptr);
}
void InputUsrPswdR(char *Usr,char*Pswd)    /*ok*/
{    
    char passwd[20] ;
    char *ptr1,*ptr2;
    int ret; 
    printf("username?");
    scanf("%s",Usr);
    do {
        ptr1= getpass("Input password : ");
        strcpy(Pswd,ptr1);
        ptr2 = getpass("Retype password : ");
        if  ((ret=strcmp(ptr2,Pswd))==0) 
            printf("password accepted!\n");
        else 
            printf("two passwords do not match,input again\n");
     }while(ret!=0);
}

int SendUsrPswd(int sockfd,char* Usr,char* Pswd)  /*ok*/
{
    int usrlen,pswlen;
    int ret1,ret2;
    usrlen=strlen(Usr);
    SendSockChar(sockfd,'B');
    pswlen=strlen(Pswd);
    ret1=write(sockfd,Usr,usrlen);
    sockendline(sockfd);
    ret2=write(sockfd,Pswd,pswlen);
    sockendline(sockfd);
    if (ret1==usrlen && ret2==pswlen)
         return 0;
    else return  -1;
}

int MailClient(int sockfd)
{
    char ch;
    printf("Login Successfully!\n");
    
   RecvMailList(sockfd);
    
    printf("\nPlease input your choice:\n");
    for(; ;){ 
             printf("[R]ead mail\n");
             printf("[D]elet mail\n");
             printf("[S]end mail\n");
             printf("[E]xit\n");
             do{
                  ch=getchar();
             }while (!isalpha(ch));
            ch=toupper(ch);
            SendSockChar(sockfd,ch);
            printf("input command:%c\n",ch);
            switch(ch){
                  case 'R':ReadMailCli(sockfd);
                               break;
                  case 'D':DelMailCli(sockfd);
                                break;
                  case 'S': SendMailCli(sockfd);
                              break;
                  case'E': printf("exit the mail system,byebye!");
                            return OK;
                  default:printf("No such command,input again!\n");
                           break;
             }
             printf("\nAnother sevice?Please input your choice:\n");
       } 
      printf("\nsevice completed,bye!\n");
      return OK;
}
int RecvMailList(int sockfd)
{
    int i;
    char ch,buf[MAXSIZE];
    ch=GetSockChar(sockfd);
    i=0;
    while(ch!=0) {
        buf[i++]=ch;
        read(sockfd,&ch,1);
     }
     buf[i]=0;   
     printf("%s\n",buf);
}        

int sockendline(int sockfd)   /*ok*/
{
    const char ch='\n';
    if (write(sockfd,&ch,1)==1) 
        return 0;
    else -1;
} 
void  CutEndl(char* str)
{
    int len;
    len=strlen(str);
    if (str[len-1]=='\n') 
                str[len-1]='\0';
}
int             /* read a text line from a descriptor */
readline (int fd,void *vptr,int maxlen)
{
    int n,rc;
    char c,*ptr;
    
    ptr = vptr;
    for (n=1;n