G
Guest
I have an application that we are porting from Unmanaged C++ to VB.NET
that involves sockets. There are two pieces to the code. One piece is
a one to one TCP call to a server which is working fine. The second
piece receives streaming data from the server on a regular basis via
UDP. My problem is that I can not make the ReceiveFrom call work.
This code is multithreaded and I don't know if that has any bearing on
it or not.
First off, I make a call to the function "OpenStreaming" which does the
following:
m_StreamSocket = New Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp)
Dim sockaddr_in As New
System.Net.SocketAddress(AddressFamily.InterNetwork)
Dim sep As New System.Net.IPEndPoint(System.Net.IPAddress.Any, nPort)
globalPort = nPort
m_StreamSocket.Bind(sep.Create(sockaddr_in))
Dim stws As New StreamThreadWithState(Me)
m_hStreamThread = New System.Threading.Thread(AddressOf
stws.StreamThread)
m_hStreamThread.Start()
"StreamThread" runs with the following code:
While (1)
Dim nResult As System.Int32
' Call StreamHandler(), the main worker function of
this thread
nResult = pThis.StreamHandler
' Check for error. Timeout errors are okay in this
instance.
If (((O22SIOMM.SIOMM_OK <> nResult) And
(O22SIOMM.SIOMM_TIME_OUT <>
nResult))) Then
Exit While
End If
' Check flag to see if we should keep looping
If pThis.m_bListenToStreaming = False Then
' Stop looping
nResult = O22SIOMM.SIOMM_OK
Exit While
End If
' Check the timeouts of all stream items
pThis.CheckStreamTimeouts()
pThis.m_hStreamThread.Sleep(1)
End While
The "StreamHandler" code is as follows:
Dim ecode As Int32
Dim nResult As System.Int32
Dim bCriticalSectionFlag As Boolean = True
Try
If (m_StreamSocket Is Nothing) Then
StreamHandler = SIOMM_ERROR_NOT_CONNECTED
Exit Function
End If
Catch e As SocketException
m_O22UTILS.writeOptoErrorToLog(Me.GetType.Name &
".StreamHandler",
e.Message, e.ErrorCode)
StreamHandler = SIOMM_TIME_OUT
Exit Function
Catch e As ObjectDisposedException
m_O22UTILS.writeOptoErrorToLog(Me.GetType.Name &
".StreamHandler",
e.Message)
StreamHandler = SIOMM_TIME_OUT
Exit Function
Catch e As Exception
m_O22UTILS.writeOptoErrorToLog(Me.GetType.Name &
".StreamHandler",
e.Message)
StreamHandler = SIOMM_TIME_OUT
Exit Function
End Try
' Creates an IpEndPoint to capture the identity of the
sending host.
Dim sender As New
System.Net.IPEndPoint(System.Net.IPAddress.Any, 0)
Dim SourceAddr As System.Net.EndPoint = CType(sender,
System.Net.EndPoint)
Try
Dim lep As System.Net.EndPoint
Dim lipep As System.Net.IPEndPoint
Dim lip As System.Net.IPAddress
lip = New
System.Net.IPAddress(System.Net.IPAddress.Parse(System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName).AddressList(0).ToString()).Address)
lipep = New System.Net.IPEndPoint(lip, globalPort)
lep = lipep
' lep = New
System.Net.IPEndPoint(lip, globalPort)
' lep = New
System.Net.IPEndPoint(System.Net.IPAddress.Any,
globalPort)
' m_StreamSocket.Bind(lep)
Dim testbytes() As Byte
ReDim testbytes(100)
Dim idx
For idx = LBound(testbytes) To UBound(testbytes)
testbytes(idx) = New Byte
testbytes(idx) = 0
Next idx
'm_StreamSocket.SendTo(testbytes, SourceAddr)
'Result =
m_StreamSocket.ReceiveFrom(m_pbyLastStreamBlock,
m_nStreamLength, SocketFlags.None, SourceAddr)
'NOTE: I have already called BIND from OpenStreaming function
'HERE IS WHERE I BLOW UP
nResult =
m_StreamSocket.ReceiveFrom(m_pbyLastStreamBlock, 660,
SocketFlags.None, SourceAddr)
Catch e As SocketException
m_O22UTILS.writeOptoErrorToLog(Me.GetType.Name &
".StreamHandler",
"m_StreamSocket.Bind : " & e.Message, e.ErrorCode)
nResult = e.ErrorCode
StreamHandler = SIOMM_ERROR
Exit Function
Catch e As ObjectDisposedException
StreamHandler = SIOMM_ERROR
m_O22UTILS.writeOptoErrorToLog(Me.GetType.Name &
".StreamHandler",
"m_StreamSocket.Bind : " & e.Message)
Exit Function
Catch e As Exception
m_O22UTILS.writeOptoErrorToLog(Me.GetType.Name &
".StreamHandler",
"m_StreamSocket.Bind : " & e.Message)
StreamHandler = SIOMM_ERROR
Exit Function
End Try
Next I make a call to "StartStreamListening" which does: (I don't think
this is important because I am not even getting data from the server
yet because of the receiveFrom failure)
m_StreamCriticalSection.WaitOne()
Checks a list of classes for data. Each class is supposed to have data
or they will not be in the list
m_StreamCriticalSection.ReleaseMutex()
I have to ship this product by Friday 5/6/2005 and I am panicking
because this function is the only item left to port before thorough
testing can begin.
Please , Please, Please can someone help.
This is being run on Windows CE but when I run it on my desktop as a normal
windows app, I don't get the invalidoperationException. Is this a bug in
compact frameworks?
Thanks,
Mike Dixon
that involves sockets. There are two pieces to the code. One piece is
a one to one TCP call to a server which is working fine. The second
piece receives streaming data from the server on a regular basis via
UDP. My problem is that I can not make the ReceiveFrom call work.
This code is multithreaded and I don't know if that has any bearing on
it or not.
First off, I make a call to the function "OpenStreaming" which does the
following:
m_StreamSocket = New Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp)
Dim sockaddr_in As New
System.Net.SocketAddress(AddressFamily.InterNetwork)
Dim sep As New System.Net.IPEndPoint(System.Net.IPAddress.Any, nPort)
globalPort = nPort
m_StreamSocket.Bind(sep.Create(sockaddr_in))
Dim stws As New StreamThreadWithState(Me)
m_hStreamThread = New System.Threading.Thread(AddressOf
stws.StreamThread)
m_hStreamThread.Start()
"StreamThread" runs with the following code:
While (1)
Dim nResult As System.Int32
' Call StreamHandler(), the main worker function of
this thread
nResult = pThis.StreamHandler
' Check for error. Timeout errors are okay in this
instance.
If (((O22SIOMM.SIOMM_OK <> nResult) And
(O22SIOMM.SIOMM_TIME_OUT <>
nResult))) Then
Exit While
End If
' Check flag to see if we should keep looping
If pThis.m_bListenToStreaming = False Then
' Stop looping
nResult = O22SIOMM.SIOMM_OK
Exit While
End If
' Check the timeouts of all stream items
pThis.CheckStreamTimeouts()
pThis.m_hStreamThread.Sleep(1)
End While
The "StreamHandler" code is as follows:
Dim ecode As Int32
Dim nResult As System.Int32
Dim bCriticalSectionFlag As Boolean = True
Try
If (m_StreamSocket Is Nothing) Then
StreamHandler = SIOMM_ERROR_NOT_CONNECTED
Exit Function
End If
Catch e As SocketException
m_O22UTILS.writeOptoErrorToLog(Me.GetType.Name &
".StreamHandler",
e.Message, e.ErrorCode)
StreamHandler = SIOMM_TIME_OUT
Exit Function
Catch e As ObjectDisposedException
m_O22UTILS.writeOptoErrorToLog(Me.GetType.Name &
".StreamHandler",
e.Message)
StreamHandler = SIOMM_TIME_OUT
Exit Function
Catch e As Exception
m_O22UTILS.writeOptoErrorToLog(Me.GetType.Name &
".StreamHandler",
e.Message)
StreamHandler = SIOMM_TIME_OUT
Exit Function
End Try
' Creates an IpEndPoint to capture the identity of the
sending host.
Dim sender As New
System.Net.IPEndPoint(System.Net.IPAddress.Any, 0)
Dim SourceAddr As System.Net.EndPoint = CType(sender,
System.Net.EndPoint)
Try
Dim lep As System.Net.EndPoint
Dim lipep As System.Net.IPEndPoint
Dim lip As System.Net.IPAddress
lip = New
System.Net.IPAddress(System.Net.IPAddress.Parse(System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName).AddressList(0).ToString()).Address)
lipep = New System.Net.IPEndPoint(lip, globalPort)
lep = lipep
' lep = New
System.Net.IPEndPoint(lip, globalPort)
' lep = New
System.Net.IPEndPoint(System.Net.IPAddress.Any,
globalPort)
' m_StreamSocket.Bind(lep)
Dim testbytes() As Byte
ReDim testbytes(100)
Dim idx
For idx = LBound(testbytes) To UBound(testbytes)
testbytes(idx) = New Byte
testbytes(idx) = 0
Next idx
'm_StreamSocket.SendTo(testbytes, SourceAddr)
'Result =
m_StreamSocket.ReceiveFrom(m_pbyLastStreamBlock,
m_nStreamLength, SocketFlags.None, SourceAddr)
'NOTE: I have already called BIND from OpenStreaming function
'HERE IS WHERE I BLOW UP
nResult =
m_StreamSocket.ReceiveFrom(m_pbyLastStreamBlock, 660,
SocketFlags.None, SourceAddr)
Catch e As SocketException
m_O22UTILS.writeOptoErrorToLog(Me.GetType.Name &
".StreamHandler",
"m_StreamSocket.Bind : " & e.Message, e.ErrorCode)
nResult = e.ErrorCode
StreamHandler = SIOMM_ERROR
Exit Function
Catch e As ObjectDisposedException
StreamHandler = SIOMM_ERROR
m_O22UTILS.writeOptoErrorToLog(Me.GetType.Name &
".StreamHandler",
"m_StreamSocket.Bind : " & e.Message)
Exit Function
Catch e As Exception
m_O22UTILS.writeOptoErrorToLog(Me.GetType.Name &
".StreamHandler",
"m_StreamSocket.Bind : " & e.Message)
StreamHandler = SIOMM_ERROR
Exit Function
End Try
Next I make a call to "StartStreamListening" which does: (I don't think
this is important because I am not even getting data from the server
yet because of the receiveFrom failure)
m_StreamCriticalSection.WaitOne()
Checks a list of classes for data. Each class is supposed to have data
or they will not be in the list
m_StreamCriticalSection.ReleaseMutex()
I have to ship this product by Friday 5/6/2005 and I am panicking
because this function is the only item left to port before thorough
testing can begin.
Please , Please, Please can someone help.
This is being run on Windows CE but when I run it on my desktop as a normal
windows app, I don't get the invalidoperationException. Is this a bug in
compact frameworks?
Thanks,
Mike Dixon