Socket problem

R

Rob T

I have a very simple little program that connects to our email server to
send out emails. When I compiled it with .VS2003 (net 1.1), it works fine.
with VS2005 (.net 2.0), it hangs on the last ReadInfo

Any suggestions? thanks!

Public Function send2() As String
Dim err As String = ""

soc = ConnectSocket(Server, 25)
Debug.Write(ReadInfo(err) & vbCrLf)
WriteInfo("HELO", Err)
Debug.Write(ReadInfo(err) & vbCrLf)

WriteInfo("MAIL FROM:" & From, err)
Debug.Write(ReadInfo(err) & vbCrLf)

WriteInfo("RCPT TO:" & "(e-mail address removed)", err)
Debug.Write(ReadInfo(err) & vbCrLf)

WriteInfo("DATA", err)
Debug.Write(ReadInfo(err) & vbCrLf)

WriteInfo("This is a test" & vbCrLf & "." & vbCrLf, err)
Debug.Write(ReadInfo(err) & vbCrLf)

WriteInfo("QUIT", err)
Debug.Write(ReadInfo(err) & vbCrLf) 'CODE HANGS HERE- SEE BELOW
soc.Close()
End Function

Private Function WriteInfo(ByVal Info As String, ByRef err As String) As
String
Dim bytes As Byte()
Dim ASCII As Encoding = Encoding.ASCII
bytes = ASCII.GetBytes(Info & vbCrLf)
soc.Send(bytes, bytes.Length, 0)
End Function

Private Function ReadInfo(ByRef Err As String) As String
Try
Dim bytes As Int32
Dim RecvBytes(256) As Byte
Dim ASCII As Encoding = Encoding.ASCII
bytes = soc.Receive(RecvBytes, RecvBytes.Length, 0) 'HANGS HERE
ON LAST ReadInfo
Return ASCII.GetString(RecvBytes, 0, bytes)
Catch ex As Exception
Err = ex.Message
End Try
End Function
 
P

Peter Duniho

I have a very simple little program that connects to our email server to
send out emails. When I compiled it with .VS2003 (net 1.1), it works
fine.
with VS2005 (.net 2.0), it hangs on the last ReadInfo

Your code displays the classic beginner bug of assuming that a single
receive will actually receive every byte that was sent. That's not true.
The Receive method can return anywhere between 1 and the total numebr of
bytes sent. It is your responsibility to keep receiving bytes until
you've gotten as many as you expect or need.

I would be surprised if changing the compiler is actually what changed the
behavior...but regardless, I suspect that if you fix the code so that in
ReadInfo, you loop until you've read as many bytes as you really want, it
will work fine. In the specific example, it appears that you want to
receive until you've gotten the cr/lf terminator for each line of data.
For different situations, you will use different criteria.

Pete
 
R

Rob T

As a followup to this. There is nothing wrong with the code. Our IT dept
had deployed a new version of Symantec Antivirus and it had the SMTP client
installed....blocks just about everything! Once I disabled it....let the
good times roll!
 
P

Peter Duniho

As a followup to this. There is nothing wrong with the code.

Well, your code still has the bug I describe. So it's not actually true
that "there is nothing wrong with the code". It may work fine now, but it
is likely to break some time in the future.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top