c# UDP odbieranie danych

0

próbuje odbierać dane od pewnego urządzenia po uprzednim zapytaniu. Odpowiedź dociera na 100% bo widzę podgląd w wiresharku.
Ale w aplikacji cisza. Teoretycznie aplikacja zrobiona jest w ten sposób że odpalona na 2 maszynach też powiniennem coś usłysze, tym czasem cisza

 
        private void button1_Click(object sender, EventArgs e)
        {
             
             RemoteIpEndPoint = new IPEndPoint(IPAddress.Parse(textBox1.Text), 28127);
           //  RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
             udpClient.Connect(RemoteIpEndPoint);

            if (nas == false)
            {   
                button1.Text = "Rozłącz";
                nas = true;
                udpClient.BeginReceive(new AsyncCallback(Odbieranie), udpClient);     
            }
            else
            {
                button1.Text = "Nasłuchuj";          
                nas = false;
            }

        }
        void Odbieranie(IAsyncResult t) 
        {

            MessageBox.Show(RemoteIpEndPoint.Address.ToString()+ " " +RemoteIpEndPoint.Port.ToString());
            Byte[] receivedBytes = udpClient.EndReceive(t, ref RemoteIpEndPoint); 
            returnData = Encoding.ASCII.GetString(receivedBytes);
            returnData = RemoteIpEndPoint.Address.ToString() + " : " + RemoteIpEndPoint.Port.ToString() + " : " + returnData;
            MessageBox.Show(returnData);
            messageReceived = true;
           

        }
    void SendData() 
        {            udpClient.BeginSend(Pocket, Pocket.Length, new AsyncCallback(Wyslano), udpClient);
            while (!messageSent)
            {
                Thread.Sleep(100);
            }
         }
        void Wyslano(IAsyncResult t)
        {
       
            MessageBox.Show("wyslano  " + udpClient.EndSend(t).ToString());
            messageSent = true;
        }


Proszę o pomysły

Wireshark
Zapytanie 30697 10335.012287 192.168.1.103 192.168.1.211 UDP 66 Source port: 28126 Destination port: 28127
Odpowiedz 30698 10335.036848 192.168.1.211 192.168.1.103 UDP 578 Source port: 28126 Destination port: 28127

0

Zauważ, że gdy masz obiekt "udpClient" nie używasz do niego metody "Close" co może się skończyć właśnie takimi błędami ;).

Masz tu poradnik do połączeń UDP: http://www.iitis.gliwice.pl/~emanuel/materialy/zsk/Cw2.pdf

Pozdrawiam ;)

0
TheCCAY napisał(a)

Zauważ, że gdy masz obiekt "udpClient" nie używasz do niego metody "Close" co może się skończyć właśnie takimi błędami ;).

Masz tu poradnik do połączeń UDP: http://www.iitis.gliwice.pl/~emanuel/materialy/zsk/Cw2.pdf

Pozdrawiam ;)

Drogi kolego to niestety nie to bo przy protokole UDP nie trzeba otwierać socketów

0
siararadek napisał(a)

Lol, to czemu na msdn zamykają? http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.aspx

UDP (ang. User Datagram Protocol – protokół pakietów użytkownika) – jeden z podstawowych protokołów internetowych. Umieszcza się go w warstwie czwartej (transportu) modelu OSI.
Jest to protokół bezpołączeniowy, więc nie ma narzutu na nawiązywanie połączenia i śledzenie sesji (w przeciwieństwie do TCP).
CIOTKA WIKI

I co w momencie kiedy nasłuchuje cały czas w osobnym wątku .... po każdym send lub receive mam zamykać ????

Mogę jeszcze dodać że po wyłączeniu zapory filtrów i innych pierdół wireshark wyrzuca

23727 12856.506087 192.168.1.115 192.168.1.103 UDP 66 Source port: 28126 Destination port: 28127
23724 12855.880799 192.168.1.103 192.168.1.115 ICMP 94 Destination unreachable (Port unreachable)

0
 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.Threading;

namespace UDP2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        UdpClient client = new UdpClient(28126);
        byte[] odb;
        string Sodb = "Start  ";
        delegate string SetValue();
        bool nas = false;
       

        void ReciveData()
        {
            while (true) 
            {
                try
                {

                    IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
                    Wstaw();
                    odb = client.Receive(ref anyIP);
                    MessageBox.Show("w");
                    Sodb = Encoding.ASCII.GetString(odb);
                    Sodb = anyIP.Address.ToString() + " : " + anyIP.Port.ToString() + " : " + odb;
                    Wstaw();
                 
                }
                catch (Exception er)
                {
                    MessageBox.Show(er.ToString());
                }
            }
  
        }
        private string Wstaw()
        {
            return (string)Invoke(new SetValue(wstawianie));
        }
        private string wstawianie()
        {
            richTextBox1.AppendText(Sodb);
            richTextBox1.ScrollToCaret();


            return Sodb;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SendData();
        }


        void SendData()
        {

            byte[] lc = new byte[4];
            byte[] pocketNr = new byte[4];
            byte[] pocketDl = new byte[2];
            byte[] reserv = new byte[2]; // ---00
            byte[] Instr = new byte[4];


            IPEndPoint Cel = new IPEndPoint(IPAddress.Parse(textBox1.Text), 28127);
            Random X = new Random(System.Environment.TickCount);
            lc = Encoding.ASCII.GetBytes("TCLY");
            pocketNr[0] = (byte)X.Next(0, 255);
            pocketNr[1] = (byte)X.Next(0, 255);
            pocketNr[2] = (byte)X.Next(0, 255);
            pocketNr[3] = (byte)X.Next(0, 255);
            reserv[0] = 0;
            reserv[1] = 0;
            byte[] InstrB1 = new byte[4];
            pocketDl = BitConverter.GetBytes(24);
            Instr = BitConverter.GetBytes(0x00000084);
            InstrB1 = BitConverter.GetBytes(0x00000000);


            byte[] Pocket = new byte[24];

            Pocket[0] = lc[0];
            Pocket[1] = lc[1];
            Pocket[2] = lc[2];
            Pocket[3] = lc[3];
            Pocket[4] = pocketNr[0];
            Pocket[5] = pocketNr[1];
            Pocket[6] = pocketNr[2];
            Pocket[7] = pocketNr[3];
            Pocket[8] = pocketDl[0];
            Pocket[9] = pocketDl[1];
            Pocket[10] = reserv[0];
            Pocket[11] = reserv[1];
            Pocket[12] = Instr[0];
            Pocket[13] = Instr[1];
            Pocket[14] = Instr[2];
            Pocket[15] = Instr[3];
            Pocket[16] = InstrB1[0];
            Pocket[17] = InstrB1[1];
            Pocket[18] = InstrB1[2];
            Pocket[19] = InstrB1[3];
            Pocket[20] = InstrB1[0];
            Pocket[21] = InstrB1[1];
            Pocket[22] = InstrB1[2];
            Pocket[23] = InstrB1[3];
            try
            {
                client.Send(Pocket, Pocket.Length, Cel);
            }
            catch (Exception err)
            {
                MessageBox.Show(err.ToString());
            }   
           finally
            {
                Sodb = " Wysłano ";
                client.Close();
                Wstaw();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (nas == false)
            {
                button2.Text = "Rozłącz";
                nas = true;

                Thread odbiornik = new Thread(new ThreadStart(ReciveData));
                odbiornik.IsBackground = true;
                odbiornik.Start();
                Wstaw();
            }
            else
            {
                button2.Text = "Nasłuchuj";
                nas = false;
            }

        }

    }


}

sposób synchroniczny ... rezultaty takie same :/

0
maszynaz napisał(a)

może firewall wyłącz?

A czytales 2 watki wyzej ???

Moze moglby ktos to ctrlV i powiedziec mi czy u niego jest taki sam problem

0

Tez mam kolego ten sam problem, znalazles juz rozwiazanie?

PS. Nie programuj w Boze Narodzenie bo bug sie rodzi ;)

0

Problem w tym że nie mam rozwiązania

2

Problem polegał na tym że nadawca ma swój port z którego wysyła zapytanie na inny port odbiorcy
Odbiorca wyśle zapytanie na port z którego zapytał nadawca i to ten port należy nasłuchiwać wtedy wszystko działa
przykład

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.Threading;

namespace UDP_Broadcast
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public string Sodb = "Start  ";
        delegate string SetValue();

  
            const int PORT_NUMBER = 120;

            Thread t = null;

            private string Wstaw()
            {
                return (string)Invoke(new SetValue(wstawianie));
            }
            private string wstawianie()
            {
                richTextBox1.AppendText(Sodb);
                richTextBox1.ScrollToCaret();


                return Sodb;
            }

            public void Start()
            {
                if (t != null)
                {
                    throw new Exception("Already started, stop first");
                }
                Console.WriteLine("Started listening");
                StartListening();
            }
            public void Stop()
            {
                try
                {
                    udp.Close();
                    Console.WriteLine("Stopped listening");
                }
                catch { /* don't care */ }
            }

            private readonly UdpClient udp = new UdpClient(14678);
            IAsyncResult ar_ = null;

            private void StartListening()
            {
                ar_ = udp.BeginReceive(Receive, new object());
            }
            private void Receive(IAsyncResult ar)
            {
                IPEndPoint ip = new IPEndPoint(IPAddress.Any, 120);
                byte[] bytes = udp.EndReceive(ar, ref ip);
                string message = Encoding.ASCII.GetString(bytes);
                Console.WriteLine("From {0} received: {1} ", ip.Address.ToString(), message);
                Sodb = "From : "+ip.Address.ToString()+" received:  "+ message+"\n";
                Wstaw();
                StartListening();
            }
            public void Send(string message)
            {
               // UdpClient client = new UdpClient(14678);
                IPEndPoint ip = new IPEndPoint(IPAddress.Parse("255.255.255.255"), PORT_NUMBER);
                byte[] bytes = Encoding.ASCII.GetBytes(message);
                udp.Send(bytes, bytes.Length, ip);
               
                Console.WriteLine("Sent: {0} ", message);
            }
        

        private void button1_Click(object sender, EventArgs e)
        {
           
            Start();
            Thread.Sleep(50);
            Send("EASYNET");
            Thread.Sleep(50);
            Send("EASYNET");
        }
  
    }
}
 
0

Trzy lata pracy i jest rozwiązanie!

user image

Sorry, ale nie mogłem sobie darować... :)

1
fourfour napisał(a):

Trzy lata pracy i jest rozwiązanie!

user image

Sorry, ale nie mogłem sobie darować... :)

Lepsze to niż nic :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1