⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sevprog.c

📁 用C语言编的邮件系统(毕业论文)
💻 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 + -