?? sevprog.c
字號:
#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<string.h>#include<sys/types.h>#include<netinet/in.h>#include<sys/socket.h>#include<sys/wait.h>#include "mail.h"#include "usrpass.h"#define MAXSIZE 500#define MYPORT 5500 #define BACKLOG 10define OK 1typedef struct{ int mail_num; char to[MAXSIZE]; char from[MAXSIZE]; char subject[MAXSIZE]; char content[MAXSIZE]; time_t recvtime;}MailStruct;int ServerMain(int);char GetSockChar(int); int SendSockChar(int,char);int readline(int,void*,int);int sockendline(int );void CutEndl(char* str);int RegisterSev(int );int RecvUsrPswd(int,char* ,char* );int LoginSev(int );int MailService(int,char*);int SendMailList(int,char*);int ReadMailSev(int sockfd);int DelMailSev(int sockfd,char*Usr);int SendMailSev(int sockfd,char*Usr);int main(){ int sockfd,new_fd; struct sockaddr_in their_addr; int sin_size; sockfd=StartListening(); while(1) { sin_size=sizeof(struct sockaddr_in); new_fd=accept(sockfd,(struct sockaddr*)&their_addr,&sin_size); if (new_fd==-1) { perror("accept"); continue; } printf("server:got connection from %s",inet_ntoa(their_addr.sin_addr)); if (!fork()) { ServerMain(new_fd); close(new_fd); } close(new_fd); } while(waitpid(-1,NULL,WNOHANG)>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 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 StartListening() /*ok*/{ int sockfd; struct sockaddr_in my_addr; int sin_size; if ((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){ perror("socket"); exit(1); } my_addr.sin_family=AF_INET; my_addr.sin_port=htons(MYPORT); my_addr.sin_addr.s_addr=INADDR_ANY; bzero(&(my_addr.sin_zero),8); if (bind(sockfd,(struct sockaddr*) &my_addr,sizeof(struct sockaddr))==-1) { perror("bindB"); exit(1); } if (listen(sockfd,BACKLOG)==-1) { perror("listen"); exit(1); } else printf("start listening the clients' connect request......\n"); printf("\nserver state:waiting for a user's sevice request \n"); return sockfd;}int ServerMain(int sockfd) /*ok*/{ char Comch,Inforch; char recvbuf[MAXSIZE],sendbuf[MAXSIZE]; char Username[MAXSIZE],Password[MAXSIZE]; printf("\n\nserver state:waiting for client's command\n"); Comch=GetSockChar(sockfd); printf("\nreceived command character: %c\n",Comch); switch (Comch) { case 'R':RegisterSev(sockfd); break; case 'L': LoginSev(sockfd); break; } return OK;}char GetSockChar(int sockfd) /*get a command char or a signal char from socket*/{ char ch; do { read(sockfd,&ch,1); }while (!isalnum(ch)); return ch;} int SendSockChar(int sockfd,char ch) /*ok*//*send a signal char to client through socket*/{ return write(sockfd,&ch,1);}int RegisterSev(int sockfd) /*ok*/{ char Usr[MAXSIZE],Pswd[MAXSIZE]; char ch; RecvUsrPswd(sockfd,Usr,Pswd); printf("received username:%s\n",Usr); printf("received password:%s\n",Pswd); UsrStore(Usr,Pswd); /* to be written by TZJ*/ SendSockChar(sockfd,'D'); }int LoginSev(int sockfd){ int ret; const char infch[2]={'F','T'}; char Usr[MAXSIZE],Pswd[MAXSIZE]; do { RecvUsrPswd(sockfd,Usr,Pswd); printf("usrname=%s\n",Usr); printf("password=%s\n",Pswd); ret=TestPasd(Usr,Pswd); /* to be written by TZJ */ printf("return is %d \n",ret); if (ret==1) { SendSockChar(sockfd,infch[1]); MailSevice(sockfd,Usr); } else SendSockChar(sockfd,infch[0]); }while (ret!=OK); return OK;}int RecvUsrPswd(int sockfd,char *Usr,char* Pswd) /*ok*/{ char ch; ch=GetSockChar(sockfd); if (ch='B') { readline(sockfd,Usr,MAXSIZE); CutEndl(Usr); readline(sockfd,Pswd,MAXSIZE); CutEndl(Pswd); }}int MailSevice(int sockfd,char*Usr){ char ch; printf("start mail sevice\n"); SendMailList(sockfd,Usr); for (; ;) { printf("\nserver:waiting for client's command\n"); ch=GetSockChar(sockfd); printf("received command char:%c",ch); switch(ch){ case 'R':ReadMailSev(sockfd); break; case 'D':DelMailSev(sockfd,Usr); break; case 'S': SendMailSev(sockfd,Usr); break; case 'E': printf("sevice for one client completed\n"); return OK; default: break; } } return OK;} int SendMailList(int sockfd,char*Usr){ FILE *stream; char c,buf[MAXSIZE],*ptr; getmsgfrmdb(Usr); printf("after getmsgfrmdb() \n"); stream = fopen(TMPMSGFILE,"r"); ptr=buf; while ((c=fgetc(stream))!=EOF) *ptr++=c; *ptr='\0'; fclose(stream); putchar('\n'); puts(buf); printf("start sending mail list for %s......",Usr); write(sockfd,buf,strlen(buf)); printf("%d bytes been sent\n",strlen(buf)); SendSockChar(sockfd,'\0'); printf("sending maillist [OK!]"); return OK;}int ReadMailSev(int sockfd){ char ch, buf[MAXSIZE],MailNum[4],*ptr; MailStruct *TempMail; int mail_id,i; TempMail=(MailStruct*)malloc(sizeof(MailStruct)); ch=GetSockChar(sockfd); readline(sockfd,MailNum,MAXSIZE); CutEndl(MailNum); mail_id=atoi(MailNum); printf("Received Mail id: %d\n ",mail_id); GetMail(mail_id,buf); /*to be written by TZJ*/ SendSockChar(sockfd,'B'); write(sockfd,buf,strlen(buf)); SendSockChar(sockfd,'\0'); ch=GetSockChar(sockfd); if (ch=='D') return OK; else return -1;}int DelMailSev(int sockfd,char*Usr){ char ch,MailNum[4]; int mail_id; ch=GetSockChar(sockfd); readline(sockfd,MailNum,MAXSIZE); CutEndl(MailNum); mail_id=atoi(MailNum); DelMail(mail_id,Usr); /*to be written by TZJ*/ SendSockChar(sockfd,'D'); ch=GetSockChar(sockfd); if (ch=='D') return OK; else return -1;} int SendMailSev(int sockfd,char* Usr){ MailStruct *TempMail; struct message *MailToStore; char ch,buf[MAXSIZE]; int i; printf("\nSendMailSev\n"); TempMail=(MailStruct*)malloc(sizeof(MailStruct)); strcpy(TempMail->from,Usr); strcpy(TempMail->content,Usr); strcat(TempMail->content,"\n"); ch=GetSockChar(sockfd); readline(sockfd,buf,MAXSIZE); CutEndl(buf); strcpy(TempMail->to,buf); strcat(TempMail->content,buf); strcat(TempMail->content,"\n"); readline(sockfd,buf,MAXSIZE); CutEndl(buf); strcpy(TempMail->subject,buf); strcat(TempMail->content,buf); strcat(TempMail->content,"\n"); read(sockfd,&ch,1); i=0; while(ch!=0) { buf[i++]=ch; read(sockfd,&ch,1); } buf[i]='\0'; strcat(TempMail->content,buf); strcat(TempMail->content,"\n"); TempMail->recvtime=time((time_t*)NULL); MailToStore=(struct message*)malloc(sizeof(struct message)); MailToStore->to=TempMail->to; MailToStore->from=TempMail->from; MailToStore->recvtime=TempMail->recvtime; MailToStore->sendtime=TempMail->recvtime; MailToStore->subject=TempMail->subject; MailToStore->content=TempMail->content; sprintf(buf,"%d",(int)MailToStore->recvtime); MailToStore->messageid=buf; printf("MailToStore-> content=\n%s\n",MailToStore->content); StoreMail(MailToStore); /* to be written by TZJ */ SendSockChar(sockfd,'D'); ch=GetSockChar(sockfd); if (ch=='D') return OK; else return -1;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -