public void First_WaitForData() { try { if (m_pfnCallBack == null) { m_pfnCallBack = new AsyncCallback(OnDataReceived); } Communications.SocketPacket theSocPkt = new Communications.SocketPacket(); theSocPkt.m_currentSocket = m_Globals.m_communications.m_clientSocket; // Start listening to the data asynchronously. int offset = 0; m_result = m_Globals.m_communications.m_clientSocket.BeginReceive( theSocPkt.dataBuffer, offset, theSocPkt.dataBuffer.Length, SocketFlags.None, m_pfnCallBack, theSocPkt ); } catch (SocketException se) { MessageBox.Show(se.Message); } }
public void WaitForData(System.Net.Sockets.Socket soc) { try { if (pfnWorkerCallBack == null) { // Specify the call back function which is to be // invoked when there is any write activity by the // connected client pfnWorkerCallBack = new AsyncCallback(OnDataReceived); } Communications.SocketPacket theSocPkt = new Communications.SocketPacket(); theSocPkt.m_currentSocket = soc; // Start receiving any data written by the connected client // asynchronously int offset = 0; soc.BeginReceive( theSocPkt.dataBuffer, offset, theSocPkt.dataBuffer.Length, SocketFlags.None, pfnWorkerCallBack, theSocPkt ); } catch (SocketException se) { MessageBox.Show(se.Message); } }
public void OnDataReceived(IAsyncResult asyn) { try { Communications.SocketPacket socketData = (Communications.SocketPacket)asyn.AsyncState; int iRx = 0; // Complete the BeginReceive() asynchronous call by EndReceive() method // which will return the number of characters written to the stream // by the client iRx = socketData.m_currentSocket.EndReceive(asyn); char[] chars = new char[iRx + 1]; System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder(); int charLen = d.GetChars(socketData.dataBuffer, 0, iRx, chars, 0); System.String szData = new System.String(chars); EndPoint remoteEndPoint = socketData.m_currentSocket.RemoteEndPoint; if (LastEndPointStarted == null) { LastEndPointStarted = remoteEndPoint; } if (LastEndPointStarted == remoteEndPoint) { // My attempts to defeat concurrent thread write collisions. I was seeing 2 end points trying to write // into the socket and that concatenated the bits at the bit level, so no byte received was even remotely // correct. I put in this equality test to force the last end point we started working with to be the // winner. The loser's message is ignored. ReceivedMsg.AppendText(szData); //when we are sure we received the entire message //pass the Object received into parameter //after removing the flag indicating the end of message String EOMDelimiter = m_Globals.m_communications.EOMDelimiter; if (ReceivedMsg.GetText().Contains(EOMDelimiter)) { LastEndPointStarted = null; String SanitizedMessage = Regex.Replace(ReceivedMsg.GetText(), EOMDelimiter, ""); ProcessCommMessage(SanitizedMessage, socketData.m_currentSocket.RemoteEndPoint); } } // Continue the waiting for data on the Socket WaitForData(socketData.m_currentSocket); } catch (ObjectDisposedException) { System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n"); } catch (SocketException se) { MessageBox.Show(se.Message); } }
public void OnDataReceived(IAsyncResult asyn) { try { Communications.SocketPacket theSockId = (Communications.SocketPacket)asyn.AsyncState; int iRx = theSockId.m_currentSocket.EndReceive(asyn); char[] chars = new char[iRx + 1]; System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder(); int charLen = d.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0); System.String szData = new System.String(chars); ReceivedMsg.AppendText(szData); // If we finished receiving the response (EventData object) from the Broker // then we will recover it. String EOMDelimiter = m_Globals.m_communications.EOMDelimiter; if (ReceivedMsg.GetText().Contains(EOMDelimiter)) { // Remove the flag "ENDOFMESSAGE" String SanitizedMessage = Regex.Replace(ReceivedMsg.GetText(), EOMDelimiter, ""); AppendToRichTextBoxHistoryResponses(SanitizedMessage); ProcessCommMessage(SanitizedMessage); ReceivedMsg.SetText(""); } First_WaitForData(); } catch (ObjectDisposedException) { System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n"); } catch (SocketException se) { MessageBox.Show(se.Message); } }