📄 cliprog.c
字号:
#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<ctype.h> /* function atoi() */#include<string.h>#include<netdb.h>#include<unistd.h> /*function char* getpass(const char*) */#include<sys/types.h>#include<netinet/in.h>#include<sys/socket.h>#define MAXSIZE 500#define OK 1typedef 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<server's ip address><server'sport>\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<maxlen;n++) { again: if ( (rc =read(fd,&c,1)) ==1) { *ptr++=c; if (c=='\n') break; /* newline is stored,like fgets() */ }else if (rc ==0) { if (n==1) return (0); /* EOF,no data read */ else break; }else{ if (errno == EINTR) goto again; return(-1); /* error,errno set by read() */ } } *ptr=0; /* null terminate like fgets() */ return(n);} int ReadMailCli(int sockfd){ char buf[MAXSIZE],MailNum[4],ch; int i; printf("\nwhich mail do you want to read?type number:"); scanf("%s",MailNum); SendSockChar(sockfd,'B'); write(sockfd,MailNum,4); sockendline(sockfd); ch=GetSockChar(sockfd); readline(sockfd,buf,MAXSIZE); CutEndl(buf); printf("From: %s\n",buf); readline(sockfd,buf,MAXSIZE); CutEndl(buf); printf("To: %s\n",buf); readline(sockfd,buf,MAXSIZE); CutEndl(buf); printf("Subject: %s\n",buf); read(sockfd,&ch,1); i=0; while(ch!=0) { buf[i++]=ch; read(sockfd,&ch,1); } buf[i]='\0'; printf("content:\n%s\n",buf); printf("[end]"); SendSockChar(sockfd,'D'); return OK;}int DelMailCli(int sockfd){ char ch,MailNum[4]; printf("\nwhich mail do you want to delete?type number:"); scanf("%s",MailNum); SendSockChar(sockfd,'B'); write(sockfd,MailNum,4); sockendline(sockfd); ch=GetSockChar(sockfd); if (ch=='D') { printf("The mail deleted successfully!"); SendSockChar(sockfd,'D'); return OK; }else return -1;}int SendMailCli(int sockfd){ FILE *stream; char ch,buf[MAXSIZE]; int i,buflen; SendSockChar(sockfd,'B'); printf("send mail to:"); scanf("%s",buf); buflen=strlen(buf); write(sockfd,buf,buflen); sockendline(sockfd); printf("subject:"); i=0; do{ ch=getchar(); }while(!isprint(ch)); do{ buf[i++]=ch; }while( (ch=getchar())!='\n'); buf[i]=0; buflen=strlen(buf); write(sockfd,buf,buflen); sockendline(sockfd); printf("input mail text:\n"); i=0; while((ch = getchar())!=EOF) buf[i++]=ch; buf[i]=0; buflen=strlen(buf); printf("\nedit comleted mail text length:%d\n",buflen); write(sockfd,buf,buflen); ch='\0'; SendSockChar(sockfd,ch); sockendline(sockfd); ch=GetSockChar(sockfd); if (ch=='D') { SendSockChar(sockfd,ch); printf("the mail is sent successfully!\n"); return OK; } else return -1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -