Hallo Forum,
ich habe den Webserver von U Radig nach meinen Bedürfnissen angepasst
und zum laufen gebracht.
Nun wollte ich einen Schritt weiter gehen und die Daten (Temperaturen
etc.) per UDP auf meinen Rechner schicken.
Den "Server" am PC habe ich selbst programmiert und dieser funktioniert
auch.
Leider stehe ich aber wo anders an.
In der Hauptschelife steht nun:
Das AVRNETIO verbindet sich zwar mit meinem Server (Server zeigt mir
seine IP und den Port an) aber ich weis nun nicht, wo ich meine Daten
(Temperaturen etc.) einfügen muss.
Soweit ich herauslesen konnte, wird alles in eth_buffer geschrieben.
Quelladresse
Zieladresse
Länge des Datagrams
Opitonale Prüfsumme
Daten
Wie bekomme ich da meine Werte rein?
Habe eth_buffer[TCP_DATA_START] gefunden. Hat mich aber auch nicht
weitergebracht.
Meine Ausgabe in C# sieht fürs erste so aus:
1
static void Main(string[] args)
2
{
3
int recv;
4
byte[] data = new byte[1024];
5
6
IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 904);
7
8
Socket newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
9
newSocket.Bind(endpoint);
10
11
Console.WriteLine("Waiting for a Client");
12
13
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 904);
Du sendest in deiner Hauptschleife den kompletten Buffer raus, inklusive
den zufälligen Speicherinhalten die da vorher schon drin standen.
"(sizeof(eth_buffer)-1)"
Dein String zusammen mit den zufälligen Zeichen wandert also so übers
Netz und wird von der Gegenstelle korrekt ausgegeben.
Also muss schauen ob noch irgendeine Methode eth-Buffer zugreift bzw
diesen zuerst auf "0" setzen.
Frag mich nur ob das auch die richtige Art und Weise ist, wie man sowas
angeht
Nein. Du würdest dann eben noch zig Nullbytes hinterhersenden.
Merk dir, während du den Buffer vollschreibst, wie viel du davon
beschrieben hast, und setze die Paketlänge entsprechend.
>> Immerhin gibt er mit "Test aaa bbb ccc" aus am Server aber leider auch> einige andere Zeichen...
Wenn du UDP-Pakete sendest, dann musst du die Daten ab UDP_DATA_START..
reinkopieren, da der Header von TCP größer ist hast du sonst noch einige
Bytes Daten, bevor Deine Nutzdaten kommen.
Sascha
Nun bekomme ich den String so wie er sein soll, allerdings mit 4
absätzen!
Des weiteren ist mir noch nicht ganz klar, wie ich zB ein int array nun
in eth_buffer bekomme!
Mein Gedanke:
1
nsigned int var_array[MAX_VAR_ARRAY] = {10,50,30,0,0,0,0,0,25,0,10,14,38,42,30,34,0,0,750,750,12,0,12,0,0,0,0,0,0,0};
Stefan schrieb:> Nun bekomme ich den String so wie er sein soll, allerdings mit 4> absätzen!
"Absätzen"??
> itoa (var_array,Data_Buffer,10);
itoa's erstes Argument ist ein Integer und kein Integer Array. Was da
konvertiert wird ist die Adresse von diesem Array. Die steht für
gewöhnlich in keinem sinnvollen Zusammenhang zu dem Inhalt des Arrays...
>> Nun bekomme ich den String so wie er sein soll, allerdings mit 4> absätzen!
Ich versteh gar nicht, was da drann so schwer zu verstehen ist.
eth_buffer hat eine Größe in Bytes
1
+--+--+--+--+--+--+--+--+--+--+--+--+--+
2
| | | | | | | | | | | | | |
3
+--+--+--+--+--+--+--+--+--+--+--+--+--+
von diesen Bytes geht ein Anteil für den Paket-Header drauf
1
+--+--+--+--+--+--+--+--+--+--+--+--+--+
2
|HH|HH|HH| | | | | | | | | | |
3
+--+--+--+--+--+--+--+--+--+--+--+--+--+
und dann schreibst du noch ein paar Nutzdaten ins Paket
1
+--+--+--+--+--+--+--+--+--+--+--+--+--+
2
|HH|HH|HH|DD|DD|DD|DD| | | | | | |
3
+--+--+--+--+--+--+--+--+--+--+--+--+--+
und wenn es dann zum versenden des Pakets kommt, dann
1
+--+--+--+--+--+--+--+--+--+--+--+--+--+
2
|HH|HH|HH|DD|DD|DD|DD| | | | | | |
3
+--+--+--+--+--+--+--+--+--+--+--+--+--+
4
5
| ----------- sizeof eth_buffer -------|
versendest du den kompletten Buffer als ganzes und wunderst dich, dass
da hinten an deine Nutzdaten drann noch etwas im Paket steht, dass du
nicht hineingeschrieben hast.
Ernsthaft?
Das verwundert dich?
> Des weiteren ist mir noch nicht ganz klar, wie ich zB ein int array nun> in eth_buffer bekomme!
Vielleicht solltest du erst mal C lernen, ehe du dich an diesen ziemlich
simplen Dingen versuchst?
=)
Alles klar nun funktioniert es, dass ich meine UDP Packete bekomme!
Das ganze ohne unnötigen Zeichen und Absätzen.
Naja C lernen... das Problem ist, dass ich nicht regelmäßig programmiere
und deswegen immer wieder etwas auffrischen muss!
Für Euch bestimmt mühsam aber dennoch vielen Dank für Eure hifle :)