/// <summary> /// Pega os dados recebido e manda para todas as conexoes ativas /// Caso nao hava dados recebidos é muito provavel que a conexao tenha falhado /// Dependendo do tipo de informacao recebida, ela nao sera distribuida /// Isso serve para comunicacao interna do programa /// </summary> /// <param name="ar"></param> public void OnRecievedData(IAsyncResult ar) { ClienteSocket cliente = (ClienteSocket)ar.AsyncState; byte[] aryRet = cliente.GetRecievedData(ar); string result = System.Text.Encoding.UTF8.GetString(aryRet); Console.WriteLine(result); // se nao houver dados, presume-se que o cliente esteja desconectado if (aryRet.Length < 1) { Console.WriteLine(cliente.Sock.RemoteEndPoint + " se desconectou."); removeDGV(cliente.Sock.RemoteEndPoint.ToString()); cliente.Sock.Close(); m_aryClients.Remove(cliente);// <---- olhar esse cara aqui return; } // Envia dos dados recebidos para todos os clientes conectados (incluindo quem mandou) if (result[0] == '1')// primeiro caracter sendo 1 identifica que a mensagem é proveniente de usuario { //remove o verificador aryRet = aryRet.Skip(1).ToArray(); foreach (ClienteSocket clientSend in m_aryClients) { try { clientSend.Sock.Send(aryRet); } catch { // Se o envio de dados por alguma razao falhar, // a conexao é encerrada. Console.WriteLine("Falha ao enviar dados para o cliente: ", cliente.Sock.RemoteEndPoint); clientSend.Sock.Close(); m_aryClients.Remove(cliente); return; } } cliente.SetupRecieveCallback(this); lbDadosRecebidos.Items.Add(System.Text.Encoding.UTF8.GetString(aryRet) + " -=" + DateTime.Now + "=-"); } //no caso da mensagem nao for para usuarios e sim comunicacao interna do programa else if (result[0] == '2') { } }
/// <summary> /// adiciona a conexao na lista de clientes. /// </summary> /// <param name="sockClient">Connection to keep</param> public void NewConnection(Socket sockClient) { ClienteSocket cliente = new ClienteSocket(sockClient); m_aryClients.Add(cliente); Console.WriteLine(cliente.Sock.RemoteEndPoint + " acabou de entrar."); //destaiva erros de cross-threads, porem nao é muito utilizado CheckForIllegalCrossThreadCalls = false; lbConexoes.Items.Add(cliente.Sock.RemoteEndPoint + " acabou de entrar."); string ip = ""; int l = Convert.ToString(cliente.Sock.RemoteEndPoint).IndexOf(":"); if (l > 0) { ip = Convert.ToString(cliente.Sock.RemoteEndPoint).Substring(0, l); } //data atual DateTime now = DateTime.Now; string nome = ""; foreach (var user in usuarios) { if (user.IP == ip) { nome = user.Nome; } } string strDateLine = "Bem-vindo " + nome + " " + now.ToString("G") + "\n\r"; // Coverte a mensagem para byte array e envia para o recem conectado Byte[] byteDateLine = System.Text.Encoding.ASCII.GetBytes(strDateLine.ToCharArray()); cliente.Sock.Send(byteDateLine, byteDateLine.Length, 0); cliente.SetupRecieveCallback(this); }