我的代码发现如下问题,谁能帮我解释一下吗? Private Function Check_Response(ByVal s As Net.Sockets.Socket, ByVal response_expected As SMTPResponse) As Boolean Dim sResponse As String Dim response As Integer Dim bytes(1024) As Byte While (s.Available = 0) System.Threading.Thread.Sleep(100) End While s.Receive(bytes, 0, s.Available, Net.Sockets.SocketFlags.None) sResponse = System.Text.Encoding.ASCII.GetString(bytes) response = Convert.ToInt32(sResponse.Substring(0, 3)) If (response <> CInt(response_expected)) Then Return False Else Return True End If End Function Private Sub Senddata(ByVal s As Net.Sockets.Socket, ByVal msg As String) Dim _msg() As Byte = System.Text.Encoding.ASCII.GetBytes(msg) s.Send(_msg, 0, _msg.Length, Net.Sockets.SocketFlags.None) End Sub Private Enum SMTPResponse : int CONNECT_SUCCESS = 220 GENERIC_SUCCESS = 250 DATA_SUCCESS = 354 QUIT_SUCCESS = 221 End Enum Private Sub sendmail() Dim tosmtpserver As String = "[email protected]" Dim host() As String = Split(tosmtpserver, "@") Dim hostname As String = host(1) Trace.Warn("hostname", hostname) Dim iphst As New System.Net.IPHostEntry() Dim dns As System.Net.Dns iphst = dns.Resolve(hostname) Dim endpt As New System.Net.IPEndPoint(iphst.AddressList(0), 25) Dim s As New System.Net.Sockets.Socket(endpt.AddressFamily, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp) s.Connect(endpt) If (Not Check_Response(s, SMTPResponse.CONNECT_SUCCESS)) Then s.Close() Label1.Text = "connect error1" Exit Sub End If 'HELO server Senddata(s, String.Format("HELO {0}\r\n", dns.GetHostName())) If (Not Check_Response(s, SMTPResponse.GENERIC_SUCCESS)) Then s.Close() Label1.Text = "connect error2" Exit Sub End If 'Identify yourself 'Servers may resolve your domain and check whether you are listed in BlackLists etc. Senddata(s, String.Format("MAIL From: {0}\r\n", "[email protected]")) If (Not Check_Response(s, SMTPResponse.GENERIC_SUCCESS)) Then s.Close() Label1.Text = "connect error3" Exit Sub End If 'Attempt Delivery (I can use VRFY, but most SMTP servers only disable it for security reasons) Senddata(s, tosmtpserver) If (Not Check_Response(s, SMTPResponse.GENERIC_SUCCESS)) Then s.Close() Label1.Text = "connect error4" Exit Sub End If ...... End Sub ================================= 这段代码在进行第2次测试连接的时候,即 'HELO server Senddata(s, String.Format("HELO {0}\r\n", dns.GetHostName())) If (Not Check_Response(s, SMTPResponse.GENERIC_SUCCESS)) Then s.Close() Label1.Text = "connect error2" Exit Sub End If就会在 While (s.Available = 0) System.Threading.Thread.Sleep(100) End While 造成死循环,s.available始终是0,不知道是那里出了问题。请高手指教
Private Function Check_Response(ByVal s As Net.Sockets.Socket, ByVal response_expected As SMTPResponse) As Boolean
Dim sResponse As String
Dim response As Integer
Dim bytes(1024) As Byte
While (s.Available = 0)
System.Threading.Thread.Sleep(100)
End While
s.Receive(bytes, 0, s.Available, Net.Sockets.SocketFlags.None)
sResponse = System.Text.Encoding.ASCII.GetString(bytes)
response = Convert.ToInt32(sResponse.Substring(0, 3))
If (response <> CInt(response_expected)) Then
Return False
Else
Return True
End If
End Function Private Sub Senddata(ByVal s As Net.Sockets.Socket, ByVal msg As String)
Dim _msg() As Byte = System.Text.Encoding.ASCII.GetBytes(msg)
s.Send(_msg, 0, _msg.Length, Net.Sockets.SocketFlags.None)
End Sub Private Enum SMTPResponse : int
CONNECT_SUCCESS = 220
GENERIC_SUCCESS = 250
DATA_SUCCESS = 354
QUIT_SUCCESS = 221
End Enum Private Sub sendmail()
Dim tosmtpserver As String = "[email protected]" Dim host() As String = Split(tosmtpserver, "@")
Dim hostname As String = host(1)
Trace.Warn("hostname", hostname) Dim iphst As New System.Net.IPHostEntry()
Dim dns As System.Net.Dns
iphst = dns.Resolve(hostname)
Dim endpt As New System.Net.IPEndPoint(iphst.AddressList(0), 25) Dim s As New System.Net.Sockets.Socket(endpt.AddressFamily, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp)
s.Connect(endpt)
If (Not Check_Response(s, SMTPResponse.CONNECT_SUCCESS)) Then
s.Close()
Label1.Text = "connect error1"
Exit Sub
End If 'HELO server
Senddata(s, String.Format("HELO {0}\r\n", dns.GetHostName()))
If (Not Check_Response(s, SMTPResponse.GENERIC_SUCCESS)) Then
s.Close()
Label1.Text = "connect error2"
Exit Sub
End If 'Identify yourself
'Servers may resolve your domain and check whether you are listed in BlackLists etc.
Senddata(s, String.Format("MAIL From: {0}\r\n", "[email protected]"))
If (Not Check_Response(s, SMTPResponse.GENERIC_SUCCESS)) Then
s.Close()
Label1.Text = "connect error3"
Exit Sub
End If 'Attempt Delivery (I can use VRFY, but most SMTP servers only disable it for security reasons)
Senddata(s, tosmtpserver)
If (Not Check_Response(s, SMTPResponse.GENERIC_SUCCESS)) Then
s.Close()
Label1.Text = "connect error4"
Exit Sub
End If
......
End Sub
=================================
这段代码在进行第2次测试连接的时候,即
'HELO server
Senddata(s, String.Format("HELO {0}\r\n", dns.GetHostName()))
If (Not Check_Response(s, SMTPResponse.GENERIC_SUCCESS)) Then
s.Close()
Label1.Text = "connect error2"
Exit Sub
End If就会在
While (s.Available = 0)
System.Threading.Thread.Sleep(100)
End While
造成死循环,s.available始终是0,不知道是那里出了问题。请高手指教