I have a client , middleware and server . The concept is a client sends a number this passes through the middleware to the server. The server checks the number against the number generated on the server side , if the client guesses the number correctly a message is then passed back to the client , however multiple clients can connect to the server , i have made an array to store the connected clients and tried implementing a for loop to broadcast a message back to the connected clients to inform them that a client has won. However the for loop will only broadcast to one client, the loop is located within the section called:
" void OnRemoteDataReceived(IAsyncResult result)"
heres the code for the middleware
#region using
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Net.NetworkInformation;
using System.Collections;
using System.Threading;
using System.Text.RegularExpressions;
#endregion
#region namespace & class
namespace middleware
{
public partial class Form1 : Form
{
private Socket server;
private byte[] clientData = new byte[1024];
private byte[] datars = new byte[1024];
//variable to keep track of connected clients
private int connections = 0;
// Array to keep a list of sockets that are assigned to each connected client
private System.Collections.ArrayList SocketList =
ArrayList.Synchronized(new System.Collections.ArrayList());
public delegate void UpdateClientListCallback();
private Socket RemoteClient;
private Socket ClientReturn;
#endregion
#region form
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
#endregion
#region Connect
private void btnClientStart_Click(object sender, EventArgs e)
{
// create listening socket
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
int port1;
port1 = int.Parse(txtClientPort.Text);
IPEndPoint localEP = new IPEndPoint(0, port1);
// bind to local ip
server.Bind(localEP);
// start listening
server.Listen(4);
// call back for clients that are connected
server.BeginAccept(new AsyncCallback(OnConnected), null);
//endpoint for clients
EndPoint epSender = (EndPoint)localEP;
btnClientStart.Enabled = false;
txtclientSerStat.Text = "Waiting for client ";
UpdateControls(true);
}
#endregion
#region UpdateControls
private void UpdateControls(bool listening)
{
btnClientStart.Enabled = !listening;
btnServerBusy.Enabled = listening;
}
#endregion
#region OnConnected
// once a client has connected this call back function will be invoked
void OnConnected(IAsyncResult result)
{
try
{
//end the accept call
Socket client = server.EndAccept(result);
//increment the client count
Interlocked.Increment(ref connections);
//add the socket to the array list
SocketList.Add(client);
// update the rich text box showing our connected clients
UpdateClientListControler();
// wait for new client connections
server.BeginAccept(new AsyncCallback(OnConnected), null);
txtclientSerStat.Text = "" + connections;
byte[] message = Encoding.ASCII.GetBytes("Welcome to the server client#"
+ connections);
//sends welcome message to the client
client.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(OnDataSent), client);
}
catch (SocketException)
{
}
}
#endregion
#region OnDataSent
void OnDataSent(IAsyncResult result)
{
Socket client = (Socket)result.AsyncState;
try
{
int sent = client.EndSend(result);
client.BeginReceive(clientData, 0, clientData.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), client);
}
catch (SocketException)
{
}
}
#endregion
#region OnDataReceived
void OnDataReceived(IAsyncResult result)
{
Socket client = (Socket)result.AsyncState;
ClientReturn = (Socket)result.AsyncState;
try
{
int receive = client.EndReceive(result);
if (receive == 0)
{
return;
}
else
{
string message = Encoding.ASCII.GetString(clientData, 0, receive);
txtGamedisplay.Text += "\r\n" + message;
txtServer1Data.Text = message;
byte[] echomessage = Encoding.ASCII.GetBytes(message);
RemoteClient.BeginSend(echomessage, 0, echomessage.Length, SocketFlags.None, new AsyncCallback(OnRemoteDataSent), null);
client.BeginReceive(clientData, 0, clientData.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), client);
}
}
catch (SocketException)
{
}
}
#endregion
#region btnServer1Connect
private void btnServer1Connect_Click(object sender, EventArgs e)
{
try
{
btnServer1Connect.Enabled = false;
RemoteClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
int port;
port = int.Parse(txtServer1Port.Text);
IPEndPoint remoteEPoint = new IPEndPoint(IPAddress.Parse(txtServer1Ip.Text), port);
RemoteClient.BeginConnect(remoteEPoint, new AsyncCallback(OnConnectedRemote), null);
}
catch
{
CloseConnection();
}
}
#endregion
#region OnConnectedRemote
void OnConnectedRemote(IAsyncResult result)
{
try
{
RemoteClient.EndConnect(result);
}
catch
{
CloseConnection();
}
}
#endregion
#region CloseConnection
public void CloseConnection()
{
RemoteClient.Close();
}
void OnRemoteDataSent(IAsyncResult result)
{
try
{
int sent = RemoteClient.EndSend(result);
RemoteClient.BeginReceive(clientData, 0, clientData.Length, SocketFlags.None, new AsyncCallback(OnRemoteDataReceived), null);
}
catch (SocketException)
{
CloseConnection();
}
}
#endregion
#region OnRemoteDataReceived
void OnRemoteDataReceived(IAsyncResult result)
{
try
{
int receive = RemoteClient.EndReceive(result);
string message = Encoding.ASCII.GetString(clientData, 0, receive);
txtRecServer1.Text = message;
datars = Encoding.ASCII.GetBytes(txtRecServer1.Text);
string input = txtRecServer1.Text;
// Here we call Regex.Match.
Match match = Regex.Match(input, "We have a winner");
// Here we check the Match instance.
if (match.Success)
{
string msg = txtRecServer1.Text;
msg = "Server Msg: " + msg + "\n";
byte[] byData = System.Text.Encoding.ASCII.GetBytes(msg);
Socket client = null;
for (int i = 0; i < SocketList.Count; i++)
{
client = (Socket)SocketList[i];
ClientReturn.BeginSend(byData, 0, byData.Length, SocketFlags.None,
new AsyncCallback(OnDataSentBack), ClientReturn);
}
}
else
{
ClientReturn.BeginSend(datars, 0, datars.Length, SocketFlags.None,
new AsyncCallback(OnDataSentBack), ClientReturn);
}
}
catch (Exception)
{
CloseConnection();
}
}
#endregion
#region OnDataSentBack
void OnDataSentBack(IAsyncResult result)
{
Socket client = (Socket)result.AsyncState;
try
{
int sent = client.EndSend(result);
}
catch (SocketException)
{
}
}
#endregion
#region UpdateClientListControler
private void UpdateClientListControler()
{
if (InvokeRequired)
{
lstConnectedClients.BeginInvoke(new UpdateClientListCallback(UpdateClientList), null);
}
else
{
UpdateClientList();
}
}
#endregion
#region UpdateClientList
void UpdateClientList()
{
lstConnectedClients.Items.Clear();
for (int i = 0; i < SocketList.Count; i++)
{
string clientName = Convert.ToString("client ");
string clientKey = Convert.ToString(i+1 );
Socket client = (Socket)SocketList[i];
if (client != null)
{
if (client.Connected)
{
lstConnectedClients.Items.Add(clientName + clientKey);
}
}
}
}
#endregion
private void btnServerBusy_Click(object sender, EventArgs e)
{
}
}
}
i have been trying to get the for loop to broadcast the message to all the connected clients for the past couple of hours with no luck, i cant see anything wrong with the for loop.