这篇贴子在ASM版放了四五天了,希望能在这里找到答案,关于smtp.
http://www.csdn.net/expert/topic/341/341480.shtm
使用socket发送邮件,前面正常,但当发送:0Dh,0Ah,".",0命令时,则收不到返回信息,无限等待下去,是否命令格式错误?。相同情况下,在C++中则没有问题,邮件发送也正常。各位兄弟可曾遇到此情况?
为方便测试,发送内容都直接定义,本机已经安装邮件服务器:
.386
.model flat,stdcall
option casemap:none
;包函inc文件
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\windows.INC
include \masm32\include\ws2_32.inc
;包函lib库文件
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\ws2_32.lib
.data ;出初化数据
wsd WSADATA <>
szServer db "127.0.0.1",0
strSuc db "正常退出",0
strErr db "异常退出",0
strMailFrom db "2@antghazi.com",0
strMailTo db "2@antghazi.com",0
strHeader db "hello",0
strBody db "OK",0
cmdHELO db "HELO",0DH,0AH,0
cmdFROM db "MAIL FROM:<","2@antghazi.com",">",0DH,0AH,0
cmdTO db "RCPT TO:<","2@antghazi.com",">",0DH,0AH,0
cmdDATA db "DATA",0DH,0AH,0
cmdEND db 0DH,0Ah,".",0DH,0AH,0
cmdQUIT db "QUIT",0DH,0AH,0
strRecv1 db 100 dup (","),0
.data?
cClent SOCKET ?
server sockaddr_in <>
strSend db ?
.code
start:
;出初化
invoke WSAStartup,202,offset wsd
.if eax!=0
jmp Exit_Main
.endif
;创建套接字
invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP
.if eax==INVALID_SOCKET
jmp Exit_Main
.endif
mov cClent,eax
;设置所要连接的服务器
mov esi,offset server
assume esi:ptr sockaddr_in ;相当于C++中强制类型转换
mov [esi].sin_family,AF_INET
invoke htons,25
mov [esi].sin_port,ax
invoke inet_addr,addr szServer
.if eax==INADDR_NONE
jmp Exit_Main
.endif
mov [esi].sin_addr.S_un,eax
;开始与服务器建立连接
invoke connect,cClent,addr server,SIZEOF server
.if eax==SOCKET_ERROR
jmp Exit_Main
.endif
invoke recv,cClent,addr strRecv1,SIZEOF strRecv1,0
invoke MessageBox,NULL,addr strRecv1,addr strRecv1,MB_OK
;开始发邮件
;第一条命令,HELO
invoke send,cClent,addr cmdHELO,SIZEOF cmdHELO,0
.if eax==SOCKET_ERROR
jmp Exit_Main
.endif
invoke recv,cClent,addr strRecv1,SIZEOF strRecv1,0
invoke MessageBox,NULL,addr strRecv1,addr strRecv1,MB_OK
;第二条命令Mail From
invoke send,cClent,addr cmdFROM,SIZEOF cmdFROM,0
.if eax==SOCKET_ERROR
jmp Exit_Main
.endif
invoke recv,cClent,addr strRecv1,SIZEOF strRecv1,0
invoke MessageBox,NULL,addr strRecv1,addr strRecv1,MB_OK
;第三条命令Mail TO
invoke send,cClent,addr cmdTO,SIZEOF cmdTO,0
.if eax==SOCKET_ERROR
jmp Exit_Main
.endif
invoke recv,cClent,addr strRecv1,SIZEOF strRecv1,0
invoke MessageBox,NULL,addr strRecv1,addr strRecv1,MB_OK
;第四条命令DATA
invoke send,cClent,addr cmdDATA,SIZEOF cmdDATA,0
.if eax==SOCKET_ERROR
jmp Exit_Main
.endif
invoke recv,cClent,addr strRecv1,SIZEOF strRecv1,0
invoke MessageBox,NULL,addr strRecv1,addr strRecv1,MB_OK
;第五条命令 结束符"."
invoke send,cClent,addr cmdEND,SIZEOF cmdEND,0
.if eax==SOCKET_ERROR
jmp Exit_Main
.endif
invoke recv,cClent,addr strRecv1,SIZEOF strRecv1,0 ;此处接收不到返回信息,程序停在这里,不知原因。请大家帮忙
invoke MessageBox,NULL,addr strRecv1,addr strRecv1,MB_OK
;第六条命令 QUIT
invoke send,cClent,addr cmdQUIT,SIZEOF cmdQUIT,0
.if eax==SOCKET_ERROR
jmp Exit_Main
.endif
;邮件发送结束
invoke closesocket,cClent
invoke WSACleanup
invoke MessageBox,NULL,addr strSuc,addr strSuc,MB_OK
invoke ExitProcess,0
jmp Exit
Exit_Main:
invoke MessageBox,NULL,addr strErr,addr strErr,MB_OK
invoke ExitProcess,0
Exit:
end start