亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? smtpr.c

?? A simple smtp relay server. Which follows smtp protocol correctly. It receive an email. and relay it
?? C
?? 第 1 頁 / 共 2 頁
字號:
  static char *special_characters = "()<>@,;:\\\"[]";
   /* validate name  */
  for (a = address;  *a;  a++) {
    if (*a == '\"' && (a == address || *(a - 1) == '.' || *(a - 1) == 
        '\"')) {
      while (*++a) {
        if (*a == '\"') break;
        if (*a == '\\' && (*++a == ' ')) continue;
        if (*a <= ' ' || *a >= 127) return 0;
      }
      if (!*a++) return 0;
      if (*a == '@') break;
      if (*a != '.') return 0;
      continue;
    }
    if (*a == '@') break;
    if (*a <= ' ' || *a >= 127) return 0;
    if (strchr(special_characters, *a)) return 0;
  }
  if (a == address || *(a - 1) == '.') return 0;

  /* next we validate the host portion (name@host) */
  if (!*(host = ++a)) return 0;
  do {
    if (*a == '.') {
      if (a == host || *(a - 1) == '.') return 0;
      number++;
    }
    if (*a <= ' ' || *a >= 127) return 0;
    if (strchr(special_characters, *a)) return 0;
  } while (*++a);

  return (number >= 1);
}

int main(int argc, char *argv[])
{
	int sockfd, new_fd;  // listen on sock_fd, new connection on new_fd
    struct sockaddr_in my_addr;    // my address information
    struct sockaddr_in their_addr; // connector's address information
    int sin_size;
    int yes=1;
    socklen_t addr_len;
    int numbytes=0;
    char buf[MAXBUFLEN] = "";
    char tmp_msg[MAXBUFLEN] ="";
    char message[SQMAXDATASIZE];
    char message_buf[10000];
    char *msg = message;
    char quit[MAXBUFLEN];
    int MYPORT;
    char relay[RELAY_NAME];
    int i,j;
    char *email = NULL;
    char *email2 = NULL;
    char *mail_from = NULL;
    char *mail_to = NULL;
    char *tmp_mail = NULL;
    char mailtos[2000];
    int mailto_num =0;
    char *data = NULL;
    char *data2 = NULL;
    char *quit1 = NULL;
    char *quit2 = NULL;

    

    int state1 = 0;  //  
    int state2 = 0;  //  keep track of number of 'helo's
        int logwhile = 0;
    char hardcode_email[15] = "cylaw@cs.hku.hk";


    #ifdef WIN32
      WSADATA wsaData;
      WSAStartup(0x0101, &wsaData);
    #endif

    /* check number of parameters */
    if ( argc != 3 && argc !=2 ) {
		fprintf(stderr,"usage: smtpr <port number> (<relay server>)\n");
		exit(1);
    }
    
    /* fill in port number */
    MYPORT = atoi(argv[1]);
    if ( MYPORT <= 0){
	fprintf(stderr, "Invalid port number.\nusage: smtpr <port number> (<relay server>)\n");
        exit(1);
    }

    /* fill in the server relay to */
    if (argc == 2) strcpy(relay, "some.mail.server");
    else if (argc == 3) strcpy(relay, argv[2]);
    printf("relay to %s\n", relay);


/*create a TCP socket */
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }
    
    printf("port number : %i\n", MYPORT);

    my_addr.sin_family = AF_INET;         // host byte order
    my_addr.sin_port = htons(MYPORT);     // short, network byte order
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // automatically fill with my IP
    memset(&(my_addr.sin_zero), '\0', 8); // zero the rest of the struct

/* bind to the port number*/
    if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
        perror("bind");
        exit(1);
    }
/* listen*/
    if (listen(sockfd, BACKLOG) == -1) {
        perror("listen");
        exit(1);
    }  
    

    /* slow the receiving speed */
//    sleep(1);
    
while(1){

logwhile++;


switch ( state1 ){
	
case ACCEPT:
/* accept */
        sin_size = sizeof(struct sockaddr_in);
        if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) {
            perror("accept");
        }
        printf("server: got connection from %s\n",inet_ntoa(their_addr.sin_addr));
       
/* send msg : 220 */       
       if (send(new_fd, "220 cylaw's smtpr ready\r\n", 25, 0) == -1)
            perror("send");


/*proceed to next state*/
        printf("state1 = %i\n", state1);
        state1++;
				break;

case HELO:

						if(state2 == 0){	//state2 keep track of if this is the first HELO
		        if ((numbytes=recv(new_fd, buf, MAXDATASIZE, 0)) == -1) {
		            perror("recv");
		            exit(1);
  		      }
  		    }
      		  buf[numbytes] = '\0';

/*   log   */	
				printf("case HELO\n");
				printf("============\n");
        printf("buf :%s\n", buf);

/* check on length */
        if ( strlen(buf) < 6 || strlen(buf) > MAXDATASIZE ){
        					printf("550 Syntax: <HELO>\n");
									if (send(new_fd, "550 Syntax: <HELO|EHLO> <hostname>\r\n", 36, 0) == -1)
									perror("HELO send");
        	}
        
/* compare (case-insensitively) the first 4 bytes of buf with "HELO" and "EHLO"  */

        if ( (strncasecmp(buf, "HELO ", 5) != 0) && (strncasecmp(buf, "EHLO ", 5) != 0 )  ){
        					printf("550 Syntax: <HELO>\n");
									if (send(new_fd, "550 Syntax: <HELO|EHLO> <hostname>\r\n", 36, 0) == -1)
									perror("HELO-1 send");
        	}
        	
/* not implement case : helo<space>aaaaa<space> */
        if ( buf[5] == '\0' && buf[5] == ' ' ){
        					printf("550 Syntax: <HELO|EHLO> <hostname>\n");
									if (send(new_fd, "550 Syntax: <HELO|EHLO> <hostname>\r\n", 36, 0) == -1)
									perror("HELO-2 send");
        	}
        
/* send 250 OK */
				printf("250 HELO OK\n");
        if ( send( new_fd, "250 HELO OK\r\n", 13, 0 ) == -1 )
        perror("HELO-250-OK send");
        printf("\n");
        


/*proceed to next state*/
        state1++;
        state2++;
        break; //case HELO

case MAILFROM :

        if ((numbytes=recv(new_fd, buf, MAXDATASIZE, 0)) == -1) {
            perror("recv");
            exit(1);
        }
        buf[numbytes] = '\0';


/*   log   */	
        printf("\n");
				printf("case MAILFROM\n");
				printf("=============\n");
        printf("buf :%s\n", buf);



/* HELO */
				if ( (strncasecmp(buf, "HELO ", 5) == 0) || (strncasecmp(buf, "EHLO ", 5) == 0 )  ){
				printf("HELO received at case MAILFROM, go back to case HELO\n");
					state1--;
					break;
				}
				
/*  check "MAIL FROM:"   */
        if ( strncasecmp(buf, "MAIL FROM:", 10) != 0 ){
        					printf("550 Syntax: MAIL FROM: <email-address>\n");
									if (send(new_fd, "550 Syntax: MAIL FROM: <email-address>\r\n", 40, 0) == -1)
											perror("MAIL FROM: send()");
								  exit(1);
       	}

/*  extract email address  */
    mail_from = extractemail(buf, 10);

     
/*  check email validity  */  

        if ( check_email_validity(mail_from) == 0 ){  //0 - invalid 1 - valid
        					printf("550 Invalid email address\r\n");
									if (send(new_fd, "550 Invalid email address\r\n", 27, 0) == -1)
										perror("Email address send()");
									break; //case MAILFROM
									
        	}

/* send 250 OK */
				printf("250 MAIL FROM OK\n");
        if ( send( new_fd, "250 MAIL FROM OK\r\n", 18, 0 ) == -1 )
        perror("MAILFROM-250-OK send()");
        
        printf("\n");

        state1++;
        break; //case MAILFROM

case RCPTTO :

/*  check if this is the first MAIL FROM: <> line  */
if ( mailto_num == 0){  
        if ((numbytes=recv(new_fd, buf, MAXDATASIZE, 0)) == -1) {
            perror("recv");
            exit(1);
        }
        buf[numbytes] = '\0';
}


/*   log   */	
        printf("\n");
				printf("case RCPTTO\n");
				printf("=============\n");
        printf("state1 = %i\n", state1);
        printf("buf :%s\n", buf);

        
/*  check RCPT TO: <...>   */
        if ( strncasecmp(buf, "RCPT TO:", 8) != 0 ){
        					printf("550 Syntax: RCPT TO: <email-address>\n");
        					if (send(new_fd, "550 Syntax: RCPT TO: <email-address>\r\n", 38, 0) == -1)
									perror("MAIL FROM: send()");
       	}

/*  extract email address  */
			mail_to = extractemail(buf, 8);  // 8 = strlen("RPCT TO:")


/*  recipients address on to mailtos []*/
		strcat(mailtos, mail_to);
		strcat(mailtos, ",");
		mailto_num++;
		printf("mailtos %s\n", mailtos);
		printf("mailto_num %i\n", mailto_num);


     	
/*  check email validity  */  

        if ( check_email_validity(mail_to) == 0 ){
        					printf("550 Invalid email address\n");
									if (send(new_fd, "550 Invalid email address\r\n", 27, 0) == -1)
									perror("RCPTTO address send()");
									break; //case MAILFROM
									
        	}

/* send 250 OK */
				printf("250 RCPT TO OK\n");
        if ( send( new_fd, "250 RCPT TO OK\r\n", 16, 0 ) == -1 )
        perror("MAILFROM-250-OK send()");

        state1++;
				break; // case RCPTTO

case DATA :

        if ((numbytes=recv(new_fd, buf, MAXDATASIZE, 0)) == -1) {
            perror("recv");
            exit(1);
        }
        buf[numbytes] = '\0';


					/*   log   */	
        printf("\n");
				printf("case DATA\n");
				printf("=============\n");
        printf("state1 = %i\n", state1);
        printf("buf :%s\n", buf);


/*  multiple recipients */

				if ( strncasecmp(buf, "RCPT TO:", 8 ) == 0){
					printf("Multiple recipients -- Go back to state RCPT TO\n");
					printf("\n");
					state1--;
					break;
				}
        
        if ( strncasecmp(buf,"DATA", 4) != 0 ){  
        					printf("451 Syntax: DATA\n");      
									if (send(new_fd, "451 Syntax: DATA\r\n", 18, 0) == -1)
										perror("DATA send");
        	} else{
				


/* send 354 OK */
//				send( new_fd, "354 End\r\n", 10, 0 );
				printf("354 End data with <CR><LF>.<CR><LF>\n");
        if ( send( new_fd, "354 End data with <CR><LF>.<CR><LF>\r\n", 37, 0 ) == -1 ){
	        perror("MAILFROM-354-OK send()");
	        printf("354 error\n");
	        exit(1);
	      }
   
        printf("\n");
      }


  state1++;
	break; // case DATA


case MESSAGE :

	      printf("\n");
				printf("case MESSAGE\n");
				printf("============\n");

				i=0;
				while(i<10000){
					i++;
        	if ((numbytes=recv(new_fd, message_buf, 9999, 0)) == -1) {
          	  perror("recv");
            	exit(1);
	        }
  	      message_buf[numbytes] = '\0';
/*  log  */
//  	      printf("message_buf:\n\n%s", message_buf);        
/*  append message_buf to message  */  	      
    	    strcat(message, message_buf);

        	if (strstr (message_buf, "\r\n.\r\n") != NULL ){
/* send 250 OK */
        		printf(". found\n");
	        	if ( send( new_fd, "250 message received\r\n", 22, 0 ) == -1 )
	  	    			  perror("MESSAGE");
        		printf("message:\n\n %s\n", message);
        		state1++;
						break;
        	}//if()
      	}//while()
      	state1++;
      	break;

case QUIT :
        
        if ((numbytes=recv(new_fd, quit, MAXDATASIZE, 0)) == -1) {
            perror("recv");
            exit(1);
        }
        quit[numbytes] = '\0';

					/*   log   */	
				printf("\n");
				printf("case QUIT\n");
				printf("=============\n");
        printf("buf :%s\n", quit);
        printf("\n");

				/*  trim space "     QUIT       "  */				
//        quit1 = malloc(strlen(quit));
//        strcpy(quit1, quit);
//        printf("quit :%s\n", quit1);
//        quit2 = trim_space(quit1);
//        printf("quit :%s\n", quit1);
        
        
/*  check QUIT   */
        if ( strncasecmp(quit, "QUIT", 4) != 0 ){
        					state1 = 	QUIT;
									if (send(new_fd, "550 Syntax: QUIT\r\n", 18, 0) == -1)
									perror("QUIT");
       	}else{
								
/* send 221 OK */
        if ( send( new_fd, "221 QUIT.\r\n", 11, 0 ) == -1 )
        perror("QUIT");
printf("QUIT!\n");
closesocket(new_fd);
state1++;
break;
}
	break; // case QUIT
	
case RELAY :
		relaymail(relay,mail_from,mailtos,mailto_num, msg);
		
		/* go back to ACCEPT states  */
		state1 = ACCEPT;  

/* reset variables  */
		strcpy(buf, "");
		strcpy(tmp_msg, "");
		strcpy(message, "");
    strcpy(message_buf, "");
		strcpy(quit,"");
    i=0;j=0;
    email = NULL;
    email2 = NULL;
    mail_from = NULL;
    mail_to = NULL;
    tmp_mail = NULL;
		strcpy(mailtos, "");
    mailto_num =0;
    data = NULL;
    data2 = NULL;
    quit1 = NULL;
    quit2 = NULL;
		state2 = 0;
		
break;
        
default : break;

}//switch
} // while(1)

        close(new_fd);
    
    #ifdef WIN32
      WSACleanup();
    #endif

    return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美大白屁股肥臀xxxxxx| 国产一区二区看久久| 免费在线观看视频一区| 国产精品99精品久久免费| 99综合电影在线视频| 欧美精品在线视频| 成人免费在线播放视频| 久久精品99国产精品日本| 欧洲一区二区三区免费视频| 久久久久久久综合狠狠综合| 丝袜美腿高跟呻吟高潮一区| 波多野结衣一区二区三区| 精品国产一区二区精华| 亚洲午夜av在线| 99国产精品久久久| 国产视频一区二区在线观看| 美女在线一区二区| 欧美日韩综合在线免费观看| 亚洲色图.com| 成人一区二区三区视频| 久久精品一区蜜桃臀影院| 青青草原综合久久大伊人精品 | 91在线无精精品入口| 久久久噜噜噜久噜久久综合| 毛片av一区二区三区| 欧美日韩国产中文| 亚洲一区在线视频观看| 在线中文字幕一区| 亚洲精品写真福利| 91蜜桃传媒精品久久久一区二区| 国产精品免费久久久久| 韩国视频一区二区| 久久综合色之久久综合| 精品在线观看免费| 欧美va日韩va| 国产精品77777竹菊影视小说| 欧美电影免费提供在线观看| 午夜电影一区二区三区| 欧美一a一片一级一片| 亚洲国产成人私人影院tom| 欧美亚州韩日在线看免费版国语版| 亚洲va在线va天堂| 亚洲欧美日韩国产另类专区| 久久99国产精品久久| 日韩你懂的在线播放| 精品久久99ma| 久久久九九九九| 亚洲一区影音先锋| 欧美三片在线视频观看 | 天天操天天干天天综合网| 欧美久久久久久久久| 麻豆精品一二三| 久久欧美一区二区| 99免费精品视频| 午夜视频一区二区| 久久综合久久综合久久| 不卡av电影在线播放| 亚洲在线视频免费观看| 91精品国产黑色紧身裤美女| 久久国产乱子精品免费女| 久久久精品欧美丰满| 91免费在线看| 免费在线一区观看| 中文字幕日韩欧美一区二区三区| 日本乱码高清不卡字幕| 免费在线观看一区二区三区| 国产欧美一区二区在线| 欧美日韩一区精品| 国产一区不卡精品| 亚洲国产乱码最新视频| 欧美精品一区二| 色先锋久久av资源部| 九色综合狠狠综合久久| 夜夜嗨av一区二区三区四季av | 日韩黄色在线观看| 亚洲国产精品黑人久久久| 欧美日韩精品免费| 粉嫩嫩av羞羞动漫久久久| 午夜精品视频一区| 国产精品久久久久久一区二区三区| 精品视频1区2区3区| 国产精品亚洲人在线观看| 视频一区国产视频| 中文字幕日韩精品一区| 久久众筹精品私拍模特| 欧美日韩国产成人在线免费| 国产成人av影院| 毛片基地黄久久久久久天堂| 一区二区高清免费观看影视大全| 久久精品在这里| 精品国产乱码久久久久久1区2区| 在线亚洲一区二区| 波多野结衣在线一区| 精品在线观看视频| 热久久久久久久| 亚洲成a人片综合在线| 亚洲猫色日本管| 国产精品美女久久久久久| 精品国产乱码久久| 91精品国产综合久久香蕉的特点 | 日韩在线观看一区二区| 亚洲欧美日韩国产中文在线| 国产无一区二区| 亚洲精品在线电影| 欧美一级欧美三级在线观看| 欧美网站一区二区| 在线观看不卡一区| 一本大道久久a久久精品综合 | 日本欧美肥老太交大片| 亚洲电影一级黄| 亚洲曰韩产成在线| 依依成人综合视频| 一区二区三区久久| 一区二区三区精品视频在线| 一区二区视频在线看| 亚洲欧美视频一区| 一区二区三区在线看| 亚洲最大成人网4388xx| 亚洲一本大道在线| 亚洲成人精品一区二区| 日韩和欧美一区二区| 亚洲成a人v欧美综合天堂下载| 亚洲午夜久久久久久久久电影院| 一区二区国产盗摄色噜噜| 亚洲香蕉伊在人在线观| 日一区二区三区| 美腿丝袜亚洲一区| 国产毛片精品国产一区二区三区| 国产乱对白刺激视频不卡 | 一区二区三区欧美在线观看| 1024亚洲合集| 国产成人在线色| 成人午夜在线播放| 91在线视频网址| 欧美男女性生活在线直播观看| 91精品啪在线观看国产60岁| 日韩欧美国产一区二区三区| 久久久影视传媒| 国产精品久久久久久久久免费樱桃 | 欧美乱熟臀69xxxxxx| 日韩欧美不卡在线观看视频| 久久久久久99久久久精品网站| 中文字幕精品综合| 亚洲激情av在线| 久久成人av少妇免费| 成人动漫一区二区在线| 欧美在线你懂的| 麻豆国产精品一区二区三区| 久久亚洲二区三区| 国产精品天天摸av网| 一区二区高清免费观看影视大全 | 337p粉嫩大胆色噜噜噜噜亚洲| 中文字幕 久热精品 视频在线| 亚洲一区二区在线观看视频| 久久丁香综合五月国产三级网站| 国产精品99久久久久久久女警| 欧美专区日韩专区| 国产亚洲精品bt天堂精选| 亚洲激情图片qvod| 国产精品1区二区.| 欧美乱妇15p| 中文字幕字幕中文在线中不卡视频| 午夜视频一区二区三区| 不卡的av网站| 欧美精品一区二区蜜臀亚洲| 亚洲午夜成aⅴ人片| 丰满少妇在线播放bd日韩电影| 欧美挠脚心视频网站| 亚洲欧洲日韩av| 老司机精品视频一区二区三区| 在线影视一区二区三区| 亚洲婷婷综合久久一本伊一区| 亚洲男同性视频| 国产剧情一区二区| 欧美久久一二三四区| ...xxx性欧美| 韩国精品久久久| 日韩一卡二卡三卡四卡| 一区二区三区在线影院| 成人精品一区二区三区四区 | 九九视频精品免费| 99国产精品久久久久久久久久| 精品久久久久99| 青娱乐精品在线视频| 欧美熟乱第一页| 亚洲女人的天堂| 成人av片在线观看| 中文字幕欧美国产| 国产成人av一区二区三区在线 | 国产1区2区3区精品美女| 欧美一区二区成人| 日韩黄色一级片| 欧美美女黄视频| 午夜精品久久久久久| 在线看日本不卡| 一区二区三区视频在线观看 | 在线一区二区观看| 国产精品视频看| 成人国产精品免费观看动漫 | 亚洲精品国产成人久久av盗摄 |