欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    SMTP服务器编写示范Word文档格式.docx

    • 资源ID:20590231       资源大小:1.33MB        全文页数:15页
    • 资源格式: DOCX        下载积分:12金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要12金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    SMTP服务器编写示范Word文档格式.docx

    1、 servaddrsin_port=htons(25); bind(1istenfd,(struct sockaddr *)&servaddr,sizeof(servaddr); listen(1istenfd,5); for(; ;) clilen=sizeof(cliaddr);connfd=accept(1istenfd,(struct sockaddr *)&cliaddr,&clilen); if(connfd=0) break; handleConnection(connfd); close(connfd); close(1istenfd);连接一旦接受,新的客户机套接字将传递给h

    2、andleconnection,以便实施SMTP服务器端协议的活动。操作完成之后,该套接字关闭,并开始等待和处理下一个连接。 这个实现是每次处理一个连接的单线程设计。这并不意味着在具体连接正在处理时(通过handleConnection),其他连接就被拒绝。基于套接字API,同时发生的连接简单进行排队,最高可以通过listen调用5个连接。这种形式的设计是有优点的,因为这是串行处理进入的邮件。因为每次可以处理一个连接,所以不需要担心存在E-mail处理时的同步问题。连接柄连接柄是根据被连接的套接字的main得到的名称,是基本SMTP服务器协议。首先初始化收到的E-mail工作拷贝的邮件结构。这

    3、个结构可以传递到后面的功能,以便执行任何所需行动。工作服务器邮件结构 #define MAX_MAIL (1024 * 1024) #define MAX_ATTACHMENT (900 * 1024) typedef struct unsigned char sender80; 发送者 unsigned char recipient80;接受者 unsigned char subject80; 主题字 unsigned char filename80; 附件文件名 unsigned char rawMailMAX_MAIL;原始邮件 unsigned char attachmentMAX_A

    4、TTACHMENT; int attachlen; )Mail;rawMail字符数组包括了通过连接接收到的原始邮件数据。 字段sender、subject、recipient、filename和attachment全部解码自rawMail。数组大小可以根据实际情况进行更新。 Attachment的大小一般应该小于rawMail(因为解码过程会把Base64编码文本的4个字节转变成3个)。大小超过限制,简单的返回错误,忽略该邮件。SMTP协议处理handleConnection()handleConnection实现了SMTP锁步协议。在客户机连接进来的时候,服务器发送致意220,并等待客户的

    5、致意响应HELO。然后,服务器处理下一步协议元素MAIL FROM、RCPT TO并给出相应回复。接收到客户机的DATA命令后会准备接收E-mail报体。报体的接收一直持续到空行和“.”的出现。在接收过程中要分析每一个进来的字符。然后等待客户的QUIT命令,结束SMTP连接。然后,转移到邮件分析parseMail。如下所示,流程见图5-4。Const char *salutation=“220 Embeded Home Mail Updaten”;Const char *conclose=“221 closing connectionn”;Const char *goahead=“250 OK

    6、n”;Const char *gimme=“354 Gimme!n”;Const char *closeit=“Service closing transmission channeln”;void handleConnection(int fd) int bufIdx=0; int state=0,len,i,stop=0; char buffer81; memset(void *)&mail,0,sizeof(mail);/*Indicate ready to go*len=write(fd,salutation,strlen(salutation);/*Fix the nmap prob

    7、lem */|if (lenMAX_MAIL-80) closeConnection(fd); return ;1er = read(fd, &mail.rawMailbufIdx, (MAX_MAIL-bufIdx);if (len = 0 ) | (bufIdx+len MAX_MAIL) retuurn;-/* Search for the end in the current buffer */for (i = bufIdx ; i bufIdx+len ; i+) if(state=0)&(mail.rawMailm=0x0d)state=1;else if (state=1)&(m

    8、ail.rawMailm=0x0a)state=2;else if (state=2)&(mail.rawMailm=.)state=3;else if (state=3)&(mail.rawMailm=0x0d)state=4;else if (state=4)&(mail.rawMailm=0x0a) stop=1;break;else state=0;bufIdx+=len;write (fd,goahead,strlen(goahead);state =0;while (state+ 10)/Wait for QUIT len=read (fd,buffer,80); buffer l

    9、en=0;if (strncmp(buffer,QUTI,4) closeconnection(fd); else break;/*We now have an email in the mail structure,try now to parse it .*/parseMail(&mail,bufIdx);write (fd, closeit, strlen(closeit);连接柄提供了基本 SMTP 服务器实现。我们先发送致意通知客户机它已经到达一个有 效的 SMTP服务器 , 准备接收报文。接下来 , 等待来自客户机的致意响应。然后 , 服务器 处理下一个协议元素 , 根据发送 E-

    10、mail 的情况 ( 通过 MAIL FROM 命令 ) 和 E-maiI 的去向通 过 RCPT 进行构造。然后 DATA 命令会等待正在准备接收的 E-maA1 报体接收报体是过程最 简单的部分。可以简单地缓冲所有收到的字符 , 直到找到只有字符 “.” 的一行。为了 性能原因 , 应该尽可能从套接字中进行读 ( 直到原始缓冲的最大可用空间 , 然后在这个缓 冲部分中查找单独符号 . 行。在这个循环中非常简单的状态机就可以提供这个功能。一旦发现 E-maAl 结束指示符 , 将确认收到 E-mail, 然后等待客户机的 QUE 命令。在服务器的这个点上 , 已经得到了包含在 mail 的

    11、rawMail 结构中的 E-mail, 以及根据 E- mal 包封进行分析的 sender 和 recipient 字段。现在就可以转移 mail 结构 ( 及其由 bufIdx 辩识的 rawMail 部分的长度到 parseMail, 以便执行进一步的分析和解码。Email分析程序parseMail()邮件分析程序的用途是在 E-mail 中 ( 从 E-mail contents 的报头开始 ) 查找主题字符串。 这个主题可以解释为 E-mail 的命令 ( 或目的。一旦发现了主题 , 分析程序便变成命令解码 器 , 然后基于发现的命令执行活动。parseMail查找E-mail中的

    12、主题。通过在E-mail报体中查找字符串Subject来发现E-mail的主题。如无相应主题,返回-1,将邮件丢弃。然后使用getAttachment来得到附件。E-mail分析程序int parseMail(parseMailType *mail, int len)int i = 0, index;int extractAttachment ( parseMailType *, int, int );/* First, grab the subject which is the location for the file */ for (i = 0 ; i rawMaili = S) / p

    13、arse Subject if (!strncmp(&mail-rawMaili, Subject:, 8) i+= 9;index = 0; while(mail-rawMailm!=0x0d &(mail-=0x0a) subjectindex+=mail-rawMailm+;subjectindex=0; break; /*if(!strncmp(mail-subject,“WEB”,3)| !subject,“APP”,3)| !subject,“CORE”,3) getAttachment(mail,m,len);else return 1;return 0;if (i = len)

    14、 return ( -1) ;/* This is our parser. We look at the subject of the received * email and then determine how to deal with the email and its * contents.if (!subject, STATUS, 6) emitStatusResponse(mail); else if (lstrncmp(mail-UPDATE/* Extract the attachment from the email */extractAttachment (mail, i,

    15、 len);/* At this point, the mail structure will have the attachment * stored in the attachment array. The attachment will contain * the length of the attachment, or -1 if an error occured. */emitUpdateResponse(mail); else /* Dont understand the command, silently ignore. */查找 E-mail 中的主题是在 E-mail 报体中

    16、查找字符串 Subject: 的一个简单过程。为了优化查 找 , 我们寻找字符 s, 一旦找到这个字符 , 再与 Subject: 字符串进行完整的对比。接着将 主题后的字符串复制到邮件结构的 Subject 字段上 , 但是不包括后面跟着的回车和换行符号。如果主题没有发现 , 会返回 -1, 表明在分析过程中遇到错误。 因为已经填写了 subject, 所以可以根据 远程控制需要所提供的特定命令 要求SMTP服务器完成相关的操作。如: WEB、Control、Core、STATUS、UPDATE等。发送状态响应的简单功能int emitStatusResponse( parseMailTyp

    17、e *mail )struct mailHeader response;char buffer512;memset(&response, 0, sizeof(struct mailHeader);/* Make the sender the new recipient */ strcpy(response.recipient, mail-sender);/* Acknowledge receipt of the message */ strcpy(response.subject, Device Status);strcpy (response. contentType, text/plain

    18、response.contents = buffer;memset(response.contents, 0, sizeof(buffer);sprintf(response.contents, Received status request from %s. nn, mail-sendMail(&response);return (0);可以利用被分析 E-mail 的发送者 , 以此作为发送 E-mail 的接收者。这时需要给出新 E-mail 的主题和内容类 型 ( 简单的text/ plain , 然后再给出应答字符串。这些功能可以使用 HTML 标志 , 提供更丰富的状态数据显示。最

    19、后 , 邮件使用 sendMai1 功能进行发送(做为SMTP的客户端发送)。UPDAIE 命令相对复杂一点 , 因为可以使用这个命令接收 Base64 格式的二进制附件。这方面的应用之一是接收将被写到闪存中的软件更新。参见如下:extractAttachment 。提取Base64编码附件的功能int extractAttachment ( parseMailType *mail, int i, int len )int index, status;/ Next, grab the filenamefor ( ;raWMaili = f) raWMaili, filename=, 9) i+

    20、= 10;while (mail-raWMaili != OxOd) & (mail-= OxOa) if (mail-raWMaili = ) i+; else mail-filenameindex+ = mail-raWMaili+;filenameindex = 0;if (i = len) printf (Couldnt find the filename. n) ;return ( -1) ; printf (The filename was %s nfilename);/* Finally, find the start of the Base64 encoded data and

    21、 * decode./* Were looking for a CR/LF on a blank line after the* filename specification (since this is in the attachment * boundary) .if (mail-rawMaili = OxOd) &rawMaili+1 = OxOa) &rawMaili+2 - OxOd) &rawMaili+3 = OxOa) i+=4;printf ( “ Couldnt find the Base64 MIME section. n “ ) ;return (-1) ;/* At

    22、this point, it is the index to the start of the Base64 * encoded section, start the decoding process. */attachlen = b64decode(&rawMaili, mail-attachrnent); /附件解码return(mail-attachlen? 0 : -1);提取附件的第一个任务是查找 filename= 字符串 , 这也在内容部分上进行 , 在此可以发 现数据。同样,查找第一个字符, 在发现了这个字符之后 , 将此与字符 串进行比较。一旦发现 , 可以复制filename 到邮件结构中的 filename 中。如果是在提供文件系统的嵌入式系统中进行操作的 , 就可以用以创建二进制文件。如果没有发现 filename, 将在调用列表中返回一个错误指示。在附件内容部分中的filename字符串之后 , E-mail 使用一个空行分隔 Base64 编码数据。跳过这个空行 ,


    注意事项

    本文(SMTP服务器编写示范Word文档格式.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

    经营许可证编号:鄂ICP备2022015515号-1

    收起
    展开