none
Executar mais de um processo no mesmo sistema RRS feed

  • Pergunta

  • Boa tarde

    Fiz um código baseado em alguns tutoriais na net e aqui no fórum que faz a leitura de algumas informações enviadas via socket, o programa esta funcionando, a leitura vem de um determinado ip e porta.

    Porém é o seguinte o equipamento que me envia os dados ele tem duas portas, logo eu precisava que no mesmo código ele pegue os dados que vem da porta 8081 e 8082 do ip do aparelho, para testar se estava funcionando eu clonei o código no mesmo form coloquei dois listview e mandei executar, funcionou porém na minha opinião ficou muito sujo, deve ter um modo que apenas com um código eu consiga pegar os dados das duas portas e jogar os dados de cada porta em um listview.

    Abaixo segue o código, porém para não ficar muita coisa na tela vou postar o código pegando apenas de uma porta:

    using ....;
    .....
    
    delegate void AddMessage(string sNewMessage);	
    
    private Socket m_sock;						
            private byte[] m_byBuff = new byte[256];	
            private event AddMessage m_AddMessage;				 
    
    public Form1()
            {
                InitializeComponent();
               
                m_AddMessage = new AddMessage(OnAddMessage);
            }
    private void Form1_Load(object sender, EventArgs e)
            {
                listView1.View = View.Details;
                listView1.Columns.Add("Hexa");
                listView1.Columns[0].Width = 200;
                listView1.Columns.Add("Wigand");
                listView1.Columns[1].Width = 200;
                listView1.View = View.Details;
    
            }
    
    private void m_btnConnect_Click(object sender, EventArgs e)
            {
                Cursor cursor = Cursor.Current;
                Cursor.Current = Cursors.WaitCursor;
                try
                {
                    // Close the socket if it is still open
                    if (m_sock != null && m_sock.Connected)
                    {
                        m_sock.Shutdown(SocketShutdown.Both);
                        System.Threading.Thread.Sleep(10);
                        m_sock.Close();
                    }
    
                    // Create the socket object
                    m_sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
                    // Define the Server address and port
                    IPEndPoint epServer = new IPEndPoint(IPAddress.Parse(m_tbServerAddress.Text), Convert.ToInt32(lblPorta.Text));
    
                    // Connect to server non-Blocking method
                    m_sock.Blocking = false;
                    AsyncCallback onconnect = new AsyncCallback(OnConnect);
                    m_sock.BeginConnect(epServer, onconnect, m_sock);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, ex.Message, "Server Connect failed!");
                }
    
              
                Cursor.Current = cursor;
            }
    
    public void OnConnect(IAsyncResult ar)
            {
                // Socket was the passed in object
                Socket sock = (Socket)ar.AsyncState;
    
                // Check if we were sucessfull
                try
                {
                    //sock.EndConnect( ar );
                    if (sock.Connected)
                        SetupRecieveCallback(sock);
                    else
                        MessageBox.Show(this, "Unable to connect to remote machine", "Connect Failed!");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, ex.Message, "Unusual error during Connect!");
                }
            }
    public void OnRecievedData(IAsyncResult ar)
            {
                // Socket was the passed in object
                Socket sock = (Socket)ar.AsyncState;
    
                // Check if we got any data
                try
                {
                    int nBytesRec = sock.EndReceive(ar);
                    if (nBytesRec > 0)
                    {
                        // Wrote the data to the List
                        string sRecieved = Encoding.ASCII.GetString(m_byBuff, 0, nBytesRec);
    
                        // WARNING : The following line is NOT thread safe. Invoke is
                        // m_lbRecievedData.Items.Add( sRecieved );
                        Invoke(m_AddMessage, new string[] { sRecieved });
    
                        // If the connection is still usable restablish the callback
                        SetupRecieveCallback(sock);
                    }
                    else
                    {
                        // If no data was recieved then the connection is probably dead
                        Console.WriteLine("Client {0}, disconnected", sock.RemoteEndPoint);
                        sock.Shutdown(SocketShutdown.Both);
                        sock.Close();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, ex.Message, "Unusual error druing Recieve!");
                }
            }
     public void OnAddMessage(string sMessage)
            {
                string x = sMessage.Replace("\n","");
                if (x.Length == 10)
                {
                    string digitos_iniciais = Convert.ToInt64(x.Substring(4, 2), 16).ToString();
                    string digitos_finais = Convert.ToInt64(x.Substring(6), 16).ToString();
    
                    ListViewItem lvi = new ListViewItem(sMessage);
                    lvi.SubItems.Add(digitos_iniciais + " " + digitos_finais);
                    listView1.Items.Add(lvi);
                }
            }
    public void SetupRecieveCallback(Socket sock)
            {
                try
                {
                    AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
                    sock.BeginReceive(m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, sock);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, ex.Message, "Setup Recieve Callback failed!");
                }
            }
     private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (m_sock != null && m_sock.Connected)
                {
                    m_sock.Shutdown(SocketShutdown.Both);
                    m_sock.Close();
                }
    
            }

    quarta-feira, 21 de agosto de 2013 16:38

Respostas

  • Ola!!!

    você pode criar 2 variáveis de socket e setar os mesmos eventos para ambos. assim ambos irão chamar os mesmos métodos. e se precisar diferencia-los, verifique a porta do sock que vem no evento e assim fazer os "IFs" que voce precisar. 

    private void m_btnConnect_Click(object sender, EventArgs e)
            {
                Cursor cursor = Cursor.Current;
                Cursor.Current = Cursors.WaitCursor;
                try
                {
                    // Close the socket if it is still open
                    if (m_sock != null && m_sock.Connected)
                    {
                        m_sock.Shutdown(SocketShutdown.Both);
                        System.Threading.Thread.Sleep(10);
                        m_sock.Close();
                    }
    ///////////////////////////////////////////////////
    // clone o if para o sock2 ou faça uma lista e um for.
    ////////////////////////////////////////////////////
    
    
                    // Create the socket object
                    m_sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    m_sock2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
    
                    // Define the Server address and port
                    IPEndPoint epServer = new IPEndPoint(IPAddress.Parse(m_tbServerAddress.Text), Convert.ToInt32(lblPorta.Text));
     IPEndPoint epServer2 = new IPEndPoint(IPAddress.Parse(m_tbServerAddress.Text), Convert.ToInt32(lblPorta2.Text));
    
                    // Connect to server non-Blocking method
                    m_sock.Blocking = false;
                    m_sock2.Blocking = false;
                    
    AsyncCallback onconnect = new AsyncCallback(OnConnect);
                    m_sock.BeginConnect(epServer, onconnect, m_sock);
    m_sock2.BeginConnect(epServer2, onconnect, m_sock2);
    
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, ex.Message, "Server Connect failed!");
                }
    
              
                Cursor.Current = cursor;
            }


    Desenvolvedor de sistemas VB6, ASP, ASP.NET, C#, VB.NET, SQL Server, Oracle e MySql.


    quinta-feira, 22 de agosto de 2013 20:52

Todas as Respostas

  • Ola!!!

    você pode criar 2 variáveis de socket e setar os mesmos eventos para ambos. assim ambos irão chamar os mesmos métodos. e se precisar diferencia-los, verifique a porta do sock que vem no evento e assim fazer os "IFs" que voce precisar. 

    private void m_btnConnect_Click(object sender, EventArgs e)
            {
                Cursor cursor = Cursor.Current;
                Cursor.Current = Cursors.WaitCursor;
                try
                {
                    // Close the socket if it is still open
                    if (m_sock != null && m_sock.Connected)
                    {
                        m_sock.Shutdown(SocketShutdown.Both);
                        System.Threading.Thread.Sleep(10);
                        m_sock.Close();
                    }
    ///////////////////////////////////////////////////
    // clone o if para o sock2 ou faça uma lista e um for.
    ////////////////////////////////////////////////////
    
    
                    // Create the socket object
                    m_sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    m_sock2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
    
                    // Define the Server address and port
                    IPEndPoint epServer = new IPEndPoint(IPAddress.Parse(m_tbServerAddress.Text), Convert.ToInt32(lblPorta.Text));
     IPEndPoint epServer2 = new IPEndPoint(IPAddress.Parse(m_tbServerAddress.Text), Convert.ToInt32(lblPorta2.Text));
    
                    // Connect to server non-Blocking method
                    m_sock.Blocking = false;
                    m_sock2.Blocking = false;
                    
    AsyncCallback onconnect = new AsyncCallback(OnConnect);
                    m_sock.BeginConnect(epServer, onconnect, m_sock);
    m_sock2.BeginConnect(epServer2, onconnect, m_sock2);
    
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, ex.Message, "Server Connect failed!");
                }
    
              
                Cursor.Current = cursor;
            }


    Desenvolvedor de sistemas VB6, ASP, ASP.NET, C#, VB.NET, SQL Server, Oracle e MySql.


    quinta-feira, 22 de agosto de 2013 20:52
  • Obrigado cara funcionou peguei também a porta pelo sock e exibi as informações separadas
    sexta-feira, 23 de agosto de 2013 18:28