Ver Mensaje Individual
  #24 (permalink)  
Antiguo 02/07/2009, 12:07
icoba
 
Fecha de Ingreso: julio-2009
Mensajes: 3
Antigüedad: 14 años, 10 meses
Puntos: 0
De acuerdo sockets

muchas gracias chcma!
tengo una duda. Como almacenas el usuario y su socket correspondiente en tu List<T>?, porque yo tengo algo parecido, solo que manejo una estructura con la informacion del cliente.
Aqui te muestro mi codigo del server:

namespace Server
{
enum Command
{
Login,
Logout,
Message,
List,
Null
}

public partial class SGSserverForm : Form
{
struct ClientInfo
{
public Socket socket;
public string strName;
public string strHostname;
}

ArrayList clientList;
public string strHostName = Dns.GetHostName();

Socket serverSocket;

byte[] byteData = new byte[1024];

public SGSserverForm()
{
clientList = new ArrayList();
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

try

{
serverSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);

IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 1000);

serverSocket.Bind(ipEndPoint);
serverSocket.Listen(10);

serverSocket.BeginAccept(new AsyncCallback(OnAccept), null);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "server",MessageBoxButtons.OK, MessageBoxIcon.Error);
}

}

private void OnAccept(IAsyncResult ar)
{
try
{
Socket clientSocket = serverSocket.EndAccept(ar);

serverSocket.BeginAccept(new AsyncCallback(OnAccept), null);

clientSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None,
new AsyncCallback(OnReceive), clientSocket);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "server",MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

private void OnReceive(IAsyncResult ar)
{
try
{
Socket clientSocket = (Socket)ar.AsyncState;
clientSocket.EndReceive(ar);

Data msgReceived = new Data(byteData);

Data msgToSend = new Data();

byte [] message;

msgToSend.cmdCommand = msgReceived.cmdCommand;
msgToSend.strName = msgReceived.strName;


switch (msgReceived.cmdCommand)
{

case Command.Login:

ClientInfo clientInfo = new ClientInfo();
clientInfo.socket = clientSocket;
clientInfo.strHostname = msgReceived.strMessage;
clientInfo.strName = msgReceived.strName;

clientList.Add(clientInfo);

msgToSend.strMessage = msgReceived.strName + " conectado";
msgToSend.strMessage = "<<" + strHostName + " conectado>>";

break;

case Command.Logout:

int nIndex = 0;
foreach (ClientInfo client in clientList)
{
if (client.socket == clientSocket)
{
clientList.RemoveAt(nIndex);
break;
}
++nIndex;
}

clientSocket.Close();

msgToSend.strMessage = msgReceived.strName + " desconectado";
msgToSend.strMessage = "<<" + strHostName + " desconectado>>";
break;

case Command.Message:

msgToSend.strMessage = msgReceived.strName + ": " + msgReceived.strMessage;
break;

case Command.List:

msgToSend.cmdCommand = Command.List;
msgToSend.strName = null;
msgToSend.strMessage = null;

foreach (ClientInfo client in clientList)
{
msgToSend.strMessage += client.strName + "*";
}

message = msgToSend.ToByte();
clientSocket.BeginSend(message, 0, message.Length, SocketFlags.None,
new AsyncCallback(OnSend), clientSocket);
break;
}

if (msgToSend.cmdCommand != Command.List)
{
message = msgToSend.ToByte();

foreach (ClientInfo clientInfo in clientList)
{
if (clientInfo.socket != clientSocket ||
msgToSend.cmdCommand != Command.Login)
{
clientInfo.socket.BeginSend(message, 0, message.Length, SocketFlags.None,
new AsyncCallback(OnSend), clientInfo.socket);
}
}

TextLogAddText(DateTime.Now.ToString("yyyy/MM/dd") + " " + DateTime.Now.ToString("hh:mm:ss")+ " " + msgToSend.strMessage + "\r\n");

}

if (msgReceived.cmdCommand != Command.Logout)
{
clientSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnReceive), clientSocket);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "server", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

private void TextLogAddText(string Text)
{
if (txtLog.InvokeRequired)
{
txtLog.Invoke(new MethodInvoker(delegate { TextLogAddText(Text); }));
return;
}
txtLog.Text += Text;
}

public void OnSend(IAsyncResult ar)
{
try
{
Socket client = (Socket)ar.AsyncState;
client.EndSend(ar);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "server", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

gracias.