private static void SendPlayerInviteCallback(IAsyncResult ar) { // Retrieve the socket from the state object. playerInviteCallbackParam param = (playerInviteCallbackParam)ar.AsyncState; Socket handler = param.hSocket; try { // Complete sending the data to the remote device. int bytesSent = handler.EndSend(ar); if (param.bAddNewSession) { SendStartGameCommand(param.newInvitation, param.nNewSessionID); } } catch (Exception e) { //console-output Console.WriteLine(""); Console.WriteLine("|========================"); Console.WriteLine("| - Error sending PLAYERINVITE command"); Console.WriteLine("| * Exception : " + e.ToString()); Console.WriteLine("| * Info : " + handler.RemoteEndPoint.ToString()); Console.WriteLine("|========================"); } // Create the state object. StateObject state = new StateObject(); state.workSocket = handler; state.neededBytes = 3; state.recvData = new ArrayList(); handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state); }
private static void SendPlayerInviteCommand(byte[] nPacket, Socket hSenderSocket) { byte[] arg = new byte[nPacket.Length - 3]; for (int i = 0; i < arg.Length; i++) { arg[i] = nPacket[i + 3]; } string strRecvName = ""; if (!MakePlayerName(arg, ref strRecvName)) { //console-output Console.WriteLine(""); Console.WriteLine("|========================"); Console.WriteLine("| - Reciever not found"); Console.WriteLine("| * PlayerName : " + strRecvName); Console.WriteLine("| * Invitation not sent"); Console.WriteLine("|========================"); } Socket recvSock = null; string strSenderName = ""; for (int i = 0; i < connectedClients.Count; i++) { netPongClientInfo cliInfo = (netPongClientInfo)connectedClients[i]; if (cliInfo.strClientName.Equals(strRecvName)) { recvSock = cliInfo.hClientTcpSocket; } if (cliInfo.hClientTcpSocket.Equals(hSenderSocket)) { strSenderName = cliInfo.strClientName; } } if ((recvSock == null) || strSenderName.Equals("")) { //console-output Console.WriteLine(""); Console.WriteLine("|========================"); Console.WriteLine("| - Client not connected"); Console.WriteLine("| * PlayerName : " + strRecvName); Console.WriteLine("| * Invitation not sent"); Console.WriteLine("|========================"); return; } byte[] byteData = null; try { byteData = Encoding.ASCII.GetBytes(strSenderName); } catch (Exception e) { //console-output Console.WriteLine(""); Console.WriteLine("|========================"); Console.WriteLine("| - Error"); Console.WriteLine("| * Info : " + e.ToString()); Console.WriteLine("|========================"); return; } bool bAddNewSession = false; netPongInvitation newSessionInvitation = new netPongInvitation(); int newSessionID = -1; for (int i = 0; i < openInvitations.Count; i++) { netPongInvitation inv = (netPongInvitation)openInvitations[i]; // invitation already exists, must be a confirm message if ((inv.infoPlayer1.strClientName.Equals(strSenderName) || inv.infoPlayer2.strClientName.Equals(strSenderName)) && (inv.infoPlayer1.strClientName.Equals(strRecvName) || inv.infoPlayer2.strClientName.Equals(strRecvName)) ) { if ((inv.infoPlayer1.strClientName.Equals(strSenderName) && inv.isConfirmedPlayer1) || (inv.infoPlayer2.strClientName.Equals(strSenderName) && inv.isConfirmedPlayer2)) { //console-output Console.WriteLine(""); Console.WriteLine("|========================"); Console.WriteLine("| - An invitation already exits between " + strRecvName + " and " + strSenderName); Console.WriteLine("|========================"); return; } //console-output Console.WriteLine(""); Console.WriteLine("|========================"); Console.WriteLine("| - Invitation confirmed between " + strRecvName + " and " + strSenderName); Console.WriteLine("|========================"); bAddNewSession = true; newSessionInvitation = inv; netPongUdpGameServer.AddGameSession(newSessionInvitation, out newSessionID); break; } //check if one of the player is already in a game if (inv.isConfirmedPlayer1) { if (inv.infoPlayer1.strClientName.Equals(strSenderName) || inv.infoPlayer1.strClientName.Equals(strRecvName)) { //console-output Console.WriteLine(""); Console.WriteLine("|========================"); Console.WriteLine("| - Error: cannot send invitation, player " + inv.infoPlayer1.strClientName + " is already in a game"); Console.WriteLine("|========================"); return; } } if (inv.isConfirmedPlayer2) { if (inv.infoPlayer2.strClientName.Equals(strSenderName) || inv.infoPlayer2.strClientName.Equals(strRecvName)) { //console-output Console.WriteLine(""); Console.WriteLine("|========================"); Console.WriteLine("| - Error: cannot send invitation, player " + inv.infoPlayer2.strClientName + " is already in a game"); Console.WriteLine("|========================"); return; } } } byte[] nSendPacket = new byte[byteData.GetLength(0) + 3]; nSendPacket[0] = (byte)netPongTcpOpCodes.NP_TCP_CMD_PLAYERINVITE; nSendPacket[1] = 0x00; nSendPacket[2] = (byte)byteData.Length; for (int i = 0; i < byteData.Length; i++) { nSendPacket[i + 3] = byteData[i]; } if (!bAddNewSession) { netPongInvitation newInv = new netPongInvitation(); netPongClientInfo player1Info = new netPongClientInfo(); GetClientInfoFromName(strSenderName, out player1Info); newInv.infoPlayer1 = player1Info; newInv.isConfirmedPlayer1 = true; netPongClientInfo player2Info = new netPongClientInfo(); GetClientInfoFromName(strRecvName, out player2Info); newInv.infoPlayer2 = player2Info; newInv.isConfirmedPlayer2 = false; openInvitations.Add(newInv); } playerInviteCallbackParam param = new playerInviteCallbackParam(); param.bAddNewSession = false; param.hSocket = recvSock; if (bAddNewSession) { param.bAddNewSession = true; param.nNewSessionID = newSessionID; param.newInvitation = newSessionInvitation; } try { // Begin sending the data to the remote device. recvSock.BeginSend(nSendPacket, 0, nSendPacket.Length, 0, new AsyncCallback(SendPlayerInviteCallback), param); } catch (Exception e) { //console-output Console.WriteLine(""); Console.WriteLine("|========================"); Console.WriteLine("| - Error"); Console.WriteLine("| * Info : " + e.ToString()); Console.WriteLine("|========================"); } }