also4930 2008-5-24 13:46
请高手们帮助修改代码
我做的程序是一个虚拟服务器,使用VB.NET语言建立smtp虚拟服务器,采用WINSOCK编程技术,根据SMTP的基本命令与响应码,通过线程监听SMTP的端口25所发来的命令,模拟smtp的服务,向客户端回应相应的响应码,实时地、动态地对所在网络的SMTP数据流予以捕获和分析,在客户端发送邮件数据后截取从客户端发过来的邮件。
程序通过telnet的测试,已经实现了对端口的监听,但telnet作为客户端发送命令服务器没有响应并给回应,请高手们帮忙修改一下,非常感谢!源代码在附件中已附上。
[attach]237[/attach]
blastar 2008-5-25 14:18
代码错误
Private Sub cServer_DataReceived(ByVal sender As UserConnection, ByVal Data As String) Handles cServer.DataReceived
Dim aSMTPSTRUCT As SMTPClient = sender.sExtraValues
Dim aSMTPResponse As SMTPResponseCodes
Dim sSMTPResponse As String
Dim sSMTPCommand As String
Dim sSMTPParam As String
aSMTPSTRUCT.AllowAction = True
RaiseEvent DataReceived(sender, Data)
aSMTPSTRUCT.CurrentCommand = sSMTPCommand
aSMTPSTRUCT.CommandParams = sSMTPParam
RaiseEvent ClientAction(sender, aSMTPSTRUCT)
sender.sExtraValues = aSMTPSTRUCT
Select Case UCase(aSMTPSTRUCT.CurrentCommand)
Case "HELO" '客户端登陆 不下去
RaiseEvent ClientLogin(sender, aSMTPSTRUCT)
If aSMTPSTRUCT.Authenticated = True Then
'sender.sExtraValues = aSMTPSTRUCT
SendSMTPResponse(sender, aSMTPResponse.msgPortSuccess)
End If
Case Is = "MAIL FROM"
SendSMTPResponse(sender, aSMTPResponse.msgTypeOk)
Case Is = "RCPT TO"
SendSMTPResponse(sender, aSMTPResponse.msgNoopOk)
Case Is = "DATA"
SendSMTPResponse(sender, aSMTPResponse.msgAborOk)
'??????循环接收
Case Is = ".<CrLf>"
SendSMTPResponse(sender, aSMTPResponse.msgStruOk)
Case Is = "QUIT" 'they want to end this session
RaiseEvent ClientLogout(sender, aSMTPSTRUCT)
SendSMTPResponse(sender, aSMTPResponse.msgQuit)
'SendSMTPResponse(sender, sSMTPResponse) 'send the response NOW
sender.CloseClientConenction()
Exit Sub
End Select
sender.sExtraValues = aSMTPSTRUCT
SendSMTPResponse(sender, sSMTPResponse)
End Sub
测试了你的程序,telnet可以连接,服务端可以接收到数据但是,你上面的这个接受到数据的程序有错。接收到的字符串是data,你赋值给SMTPSTRUCT的字符串只是一个未赋值的字符串而已。
blastar 2008-5-25 14:40
Data 里面包含 Command 和 Params两部分,你应该先对接收到的字符串进行处理,然后再对SMTPSTRUCT结构赋值。
注意,客户端发送过来的字符串都是以vbCRLF结尾的。