예제 #1
0
        /// <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')
            {
            }
        }
예제 #2
0
        /// <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);
        }