Forum: Compiler & IDEs Versuche UDP-Kommunkation Beispielcode zu compilieren


von Nils S. (kruemeltee) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe hier eine Chamsys Pro2010 Lichtkonsole mit MagicQ. Diese will 
ich fernsteuern und im Manual ist das Protokoll sowie ein Beispiel 
C-Code abgedruckt. Diesen Code will ich gerade versuchen zum Laufen zu 
bringen.

Hab den nun soweit in ein C-File gepackt, dass er nahezu 
durchcompiliert.
Im Anhang ist der Auszug des Manuals als PDF und das C File von mir,
hier der Fehler und die relevante Stelle im Code:


>main.c: In function ‘remote_ether_tx’:
>main.c:119: error: ‘my_broadcast_address’ undeclared (first use in this function)
>main.c:119: error: (Each undeclared identifier is reported only once
>main.c:119: error: for each function it appears in.)
>main.c:119: error: ‘ip_address’ undeclared (first use in this function)
>main.c:119: error: ‘subnet_address’ undeclared (first use in this function)


1
struct sockaddr_in name;
2
...
3
my_broadcast_address.s_addr = ip_address | ~subnet_address;
4
...
5
name.sin_addr.s_addr = dwswap (my_broadcast_address.s_addr);

WIE genau muss my_broadcast_address definiert sein, wie 
ip_address/subnet_address?
Und wie bekomme ich die beiden Adressen IP/Subnet in die beiden rein?

Die Netzwerkeinstellungen der Chamsys Konsole sind IP 2.9.200.137/8. 
Also wird subnet_address wohl 255.0.0.0 sein, ip_address dann 
2.9.200.137.

Ich hoffe ihr könnt mir dabei helfen, ich suche mir schon seit heute die 
Finger wund...

von Klaus W. (mfgkw)


Lesenswert?

Nils S. schrieb:
> WIE genau muss my_broadcast_address definiert sein

das müsste zumindest unter Unix/Linux ein struct in_addr sein.

Möglicherweise hat MS das unter Windows mal wieder etwas "besser"
gemacht und man muß statt my_broadcast_address.s_addr etwas viel
schöneres nehmen, nämlich my_broadcast_address.S_un.S_addr
(wenn ich das auf MSDN richtig gelesen habe).

ip_address ist in Linux ein uint32_t bzw. in_addr_t, in Windows
eine unsigend long. subnet_address ebenso.


Außerdem fehlt in dem Beispiel in der PDF noch mehr, z.B. die
nötigen Headerdateien.
Unter Windows wäre das:
1
#include <winsock2.h>
Unter Linux dagegen:
1
#include <sys/types.h>
2
#include <sys/socket.h>

Siehe auch 
http://msdn.microsoft.com/en-us/library/ms741435(v=VS.85).aspx

Nils S. schrieb:
> Ich hoffe ihr könnt mir dabei helfen, ich suche mir schon seit heute die
> Finger wund...

Ein Tag ist doch gar nichts, wenn man mit Socketprogrammierung anfängt 
:-)

von Klaus (Gast)


Lesenswert?

Linux Socket Programming By Example, Warren W. Gay, ISBN 0-7897-2241-0

MfG Klaus

von Klaus W. (mfgkw)


Lesenswert?

Nils S. schrieb:
> Und wie bekomme ich die beiden Adressen IP/Subnet in die beiden rein?

http://msdn.microsoft.com/en-us/library/ms738520(v=vs.85).aspx

Oder die bekannten Adressen von Hand reinschieben, aber nicht vergessen 
den Wert in network byte order zu bringen...

mfg der andere Klaus :-)

von Nils S. (kruemeltee) Benutzerseite


Angehängte Dateien:

Lesenswert?

Also nach einem Tag dran rumbasteln funktionierts jetzt endlich :)

Schade, dass in der Doku die 10 Zeilen mehr einfach fehlen...

gelöst hab ich es jetzt so:
1
struct in_addr my_broadcast_address;
2
3
my_broadcast_address.s_addr = inet_addr("2.9.200.140") | ~inet_addr("255.0.0.0");

Im Grunde ganz einfach...

>uint32_t bzw. in_addr_t, in Windows eine unsigend long
auf x86 ja das Gleiche

>Oder die bekannten Adressen von Hand reinschieben, aber nicht vergessen
>den Wert in network byte order zu bringen...
Mit dem msdn Zeug kam ich nicht sehr weit, aber das hat mit auf die 
entsprechende Linux-Doku gebracht :)

Im Anhang die funzende C-Datei, ich werd das jetzt mal ins 
ChamSys/MagicQ Forum stellen, hoffentlich übernehmen die das in die 
Doku.

Vielen Dank für eure Hilfe!

PS: 1 Tag ist nichts? Das hab ich jetzt auch gemerkt :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.