Laden...

Struktur per UDP übertragen

Erstellt von KingT vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.332 Views
K
KingT Themenstarter:in
14 Beiträge seit 2009
vor 13 Jahren
Struktur per UDP übertragen

moin moin,
bisher kann ich - dank der tutorials im netz - strings über udp versenden:


public struct meineStruktur
{
    public int var1, var2, var3;
}

namespace UDP_allinone_GUI
{
    public partial class MainForm : Form
    {
        meineStruktur test;
        public delegate void ShowMessage(string message);
        public ShowMessage myDelegate;
        Int32 port = 6000, localport = 7000;
        string ip = "192.168.0.100";
        UdpClient server = new UdpClient(7000);
        Thread recv_thread;
        
        public MainForm()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            myDelegate = new ShowMessage(ShowMessageMethod);

            recv_thread = new Thread(new ThreadStart(ReceiveMessage));
            recv_thread.IsBackground = true;
            recv_thread.Start();
        }

        private void senden_Click(object sender, EventArgs e)
        {
            IPEndPoint iep = new IPEndPoint(IPAddress.Parse(ip), port);
            
            byte[] data = Encoding.UTF8.GetBytes(sendtext_tb.Text);

            try
            {
                server.Send(data, data.Length, iep);
            }
            catch (Exception err)
            {
                MessageBox.Show(err.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            sendtext_tb.Text = "";
        }

        private void Schliessen(object sender, FormClosingEventArgs e)
        {
            recv_thread.Abort();
            server.Close();
        }

        private void ShowMessageMethod(string message)
        {
            recvdata_tb.AppendText(message + "\r\n");
        }

        private void ReceiveMessage()
        {
            while (true)
            {
                try
                {
                    IPEndPoint iep = new IPEndPoint(IPAddress.Any, localport);

                    byte[] data = server.Receive(ref iep);

                    if (data.Length > 0)
                    {
                        string message = Encoding.UTF8.GetString(data);
                        this.Invoke(myDelegate, new object[] { message });
                    }
                }
                catch (Exception err)
                {
                    MessageBox.Show(err.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
        }
    }
}

nun müsst ich aber genau 3 variablen mit je genau 4 bytes in der richtigen reinfolge in einem paket


public struct meineStruktur
{
    public int var1, var2, var3;
}

übertragen, da am anderen ende kein PC sondern ne SPS sitzt.
also die zahlen als string oder nacheinander zu uebertragen faellt also leider aus. hab auch schon versucht die struktur zu serialisieren, aber dann ist die struktur angeblich 115byte gross statt der erwarteten 12.

waere super wenn mir hier jemand ein tip geben könnte wie sich das realisieren laesst.
vielen dank schon mal!

479 Beiträge seit 2008
vor 13 Jahren

Hallo KingT,

da gibts verschiedene Möglichkeiten.
Ersteinmal musst du deine struct mit dem Attribut

[StructLayout(LayoutKind.Sequential)]

versehen. Dann kannst du z. B. Pointer verwenden, mit Marshals gehts aber auch. Das wurde im Forum schon öfters besprochen.

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
I
1.739 Beiträge seit 2005
vor 13 Jahren

Die Zahlen werden bei 4 Bytes wohl als Int32 übertragen.
tb.Text muss also erst in Integer geparst werden, dann in ein Bytearray gewandelt werden(BitConverter). Eventuell müsste das Bytearray noch gedreht werden(LittleEndian : BigEndian). Und zurück bei Receive.

B
14 Beiträge seit 2010
vor 13 Jahren

wie kann ich denn byte arrays die ich ja auf meinem system im little endian habe zu bigendian umwandeln ?

also bsp:


        UInt16 länge= 60; 
        byte[] länge_arr = BitConverter.GetBytes(länge);

zu big endian