/// <summary> /// This function is "called" by the operating system when data arrives on the socket /// </summary> /// <param name="ar"></param> private static void ReceiveCallback(IAsyncResult ar) { SocketState ss = (SocketState)ar.AsyncState; ss.Connected = true; int bytesRead = 0; try { bytesRead = ss.theSocket.EndReceive(ar); // If the socket is still open if (bytesRead > 0) { string theMessage = Encoding.UTF8.GetString(ss.messageBuffer, 0, bytesRead); // Append the received data to the growable buffer. // It may be an incomplete message, so we need to start building it up piece by piece ss.sb.Append(theMessage); ss._call(ss); } else { DisconnectError(ss, "Stopped getting data from server"); ss.theSocket.Close(); } } catch (Exception e) { // set the connection to false to ss.Connected = false; // trigger a disconnect event that passes in a socket state. Calling it here because this seems to be where // exceptions are thrown after a disconnect. DisconnectError(ss, e.Message); } }
/// <summary> /// The function that continues the event loop for each new client connection /// </summary> /// <param name="ar"></param> public static void AcceptNewClient(IAsyncResult ar) { ListenerState ls = (ListenerState)ar.AsyncState; Socket socket = ls.listener.EndAcceptSocket(ar); SocketState ss = new SocketState(socket, ls._call, ls.ID); ss._call(ss); ls.ID++; ls.listener.BeginAcceptSocket(AcceptNewClient, ls); }
/// <summary> /// This function is "called" by the operating system when the remote site acknowledges the connect request /// </summary> /// <param name="ar"></param> private static void ConnectedCallback(IAsyncResult ar) { SocketState ss = (SocketState)ar.AsyncState; // Complete the connection. try { ss.theSocket.EndConnect(ar); ss._call(ss); } catch (Exception e) { System.Diagnostics.Debug.WriteLine(e.Message); } }