/// <summary> /// Verifies initial connection and notifies the client. Automatically called on successful connection. /// </summary> /// <param name="stateAsArObject"></param> private static void ConnectedCallback(IAsyncResult stateAsArObject) { SocketState ss = (SocketState)stateAsArObject.AsyncState; try { ss.theSocket.EndConnect(stateAsArObject); ss.ClientCallback(ss); GetData(ss); } catch (Exception e) { ss.theSocket.Close(); Console.WriteLine(e.ToString()); ss.ClientCallback(ss); } }
/// <summary> /// OS calls this function upon client contact with the server. Calls the server's callback function then begins the client loop again. /// </summary> /// <param name="ar"></param> private static void AcceptNewClient(IAsyncResult ar) { Console.WriteLine("A new player has joined the server."); ServerListenerState sls = (ServerListenerState)ar.AsyncState; TcpListener tcpListener = sls.ServerListener; Socket socket = tcpListener.EndAcceptSocket(ar); socket.NoDelay = true; SocketState ss = new SocketState(socket, 0); ss.ClientCallback = sls.ServerCallback; ss.theSocket = socket; ss.ClientCallback(ss); sls.ServerListener.BeginAcceptSocket(AcceptNewClient, sls); }
/// <summary> /// Automatically called when data is received. Makes sure there is data, and notifies the client/server that data has arrived. /// </summary> /// <param name="stateAsArObject"></param> private static void ReceiveCallback(IAsyncResult stateAsArObject) { try { SocketState ss = (SocketState)stateAsArObject.AsyncState; int bytesRead = ss.theSocket.EndReceive(stateAsArObject); // 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.ClientCallback(ss); } } catch (Exception e) { Console.WriteLine("EXCEPTION: " + e.Message); } }