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