private void OnReceive(IAsyncResult ar)
{
try
{
//Required variables
IPEndPoint ipeSender = new IPEndPoint(IPAddress.Any, 0);
EndPoint epSender = (EndPoint)ipeSender;
serverSocket.EndReceiveFrom(ar, ref epSender);
byte[] message;
//Transform the array of bytes received from the user into an
//intelligent form of object Data
Data msgReceived = new Data(byteData);
//We will send this object in response the users request
Data msgToSend = new Data();
//If the message is to login, logout, or simple text message
//then when send to others the type of the message remains the same
msgToSend.cmdCommand = msgReceived.cmdCommand;
msgToSend.strName = msgReceived.strName;
//Check which kind of message we received
switch (msgReceived.cmdCommand)
{
case Command.Login:
//When a user logs in to the server then we add her to our
//list of clients
if (playercount == 0)
{
//Setup player 1
Player player1 = new Player();
ClientInfo clientInfo = new ClientInfo();
clientInfo.endpoint = epSender;
clientInfo.strName = msgReceived.strName;
msgToSend.cmdCommand = Command.Login;
msgToSend.id = playercount;
clientList.Add(clientInfo);
player1.x = 100;
player1.y = 100;
player1.radius = 16;
player1.playername = msgReceived.strName;
player1.id = playercount;
playerList.Add(player1);
playercount = playercount + 1;
//Setup planets (1 for now)
Planets planet = new Planets();
planet.x = 400;
planet.y = 300;
planet.radius = 32;
planet.mass = 150;
planetList.Add(planet);
planetcount = 1;
//Set the text of the message that we will broadcast to all users (doesn't currently do much)
msgToSend.strMessage = "<<<" + msgReceived.strName + " has joined the room>>>";
msgToSend.cmdCommand = Command.Login;
}
else
{
//Setup player 2
Player player2 = new Player();
ClientInfo clientInfo = new ClientInfo();
clientInfo.endpoint = epSender;
clientInfo.strName = msgReceived.strName;
msgToSend.id = playercount;
player2.id = playercount;
clientList.Add(clientInfo);
player2.x = 700;
player2.y = 500;
player2.radius = 16;
player2.playername = msgReceived.strName;
player2.id = playercount;
playerList.Add(player2);
playercount = playercount + 1;
//Set the text of the message that we will broadcast to all users
msgToSend.strMessage = "<<<" + msgReceived.strName + " has joined the room>>>";
msgToSend.cmdCommand = Command.Login;
}
break; //End case login
case Command.Create:
//Create objects (not currently in use)
break; //End case create
case Command.Logout:
//When a user wants to log out of the server then we search for her
//in the list of clients and close the corresponding connection
//TODO: Fix logout errors.
int nIndex = 0;
foreach (ClientInfo client in clientList)
{
if (client.endpoint == epSender)
{
clientList.RemoveAt(nIndex);
break;
}
++nIndex;
}
//Set the text of the message that we will broadcast to all users
msgToSend.strMessage = "<<<" + msgReceived.strName + " has left the room>>>";
break; //End case logout
case Command.Message:
//Set the text of the message that we will broadcast to all users
msgToSend.strMessage = msgReceived.strName + ": " + msgReceived.strMessage;
break;//End case message
case Command.Move:
//Setup the move command
msgToSend = PlayerAction(msgReceived);
msgToSend.cmdCommand = msgReceived.cmdCommand;
break;//End case move
case Command.List:
//Send the names of all users in the chat room to the new user
msgToSend.cmdCommand = Command.List;
msgToSend.strName = null;
msgToSend.strMessage = null;
//Collect the names of the user in the chat room
foreach (ClientInfo client in clientList)
{
//To keep things simple we use asterisk as the marker to separate the user names
msgToSend.strMessage += client.strName + "*";
}
//Setup our message to send
message = msgToSend.ToByte(playerList, bulletList, removeids, playercount, planetList);
//Send the name of the users in the chat room
serverSocket.BeginSendTo(message, 0, message.Length, SocketFlags.None, epSender, new AsyncCallback(OnSend), epSender);
break;
}//End command list
//TODO: Add check to see if it is a login, if it is send the players ID to the client
//When the client receives the login response it will set the users ID to the correct value
if (msgToSend.cmdCommand == Command.Login)
{
//Send the login message
message = msgToSend.ToByte(playerList, bulletList, removeids, playercount, planetList);
serverSocket.BeginSendTo(message, 0, message.Length, SocketFlags.None, epSender, new AsyncCallback(OnSend), epSender);
msgToSend.cmdCommand = Command.Create;
message = msgToSend.ToByte(playerList, bulletList, removeids, playercount, planetList);
serverSocket.BeginSendTo(message, 0, message.Length, SocketFlags.None, epSender, new AsyncCallback(OnSend), epSender);
msgToSend.cmdCommand = Command.Login;
}
if (msgToSend.cmdCommand != Command.List)
{
//Setup the list message
message = msgToSend.ToByte(playerList, bulletList, removeids, playercount, planetList);
foreach (ClientInfo clientInfo in clientList)
{
//Send the message to all users
serverSocket.BeginSendTo(message, 0, message.Length, SocketFlags.None, clientInfo.endpoint,
new AsyncCallback(OnSend), clientInfo.endpoint);
}
}
//If the user is logging out then we need not listen from her
//Start listening to the message send by the user
serverSocket.BeginReceiveFrom(byteData, 0, byteData.Length, SocketFlags.None, ref epSender, new AsyncCallback(OnReceive), epSender);
}
//Exception handling
catch (Exception ex)
{
MessageBox.Show(ex.Message, "GameUDPServer", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}