Hallo zusammen, ich habe ein Problem mit dem LwIP und Sockets. Ich möchte Daten an mein Gerät senden, also an verschiedene Sockets. Das Beispiel von Uwe (Der Exponent) mit dem HTTP Server läuft wunderbar. Jetzt hab ich mir Beispiele aus dem Netz angesehen und dachte es wäre so einfach, aber leider meckert mein Compiler. Beispiel: #include <lwip/sockets.h> #define SENDER_PORT_NUM 6000 #define SENDER_IP_ADDR "192.136.23.20" #define SERVER_PORT_NUM 6001 #define SERVER_IP_ADDRESS "192.136.23.21" void main(void) { int socket_fd,accept_fd; int addr_size,sent_data; char data_buffer[80]; struct sockaddr_in sa,ra,isa; /* Creates an TCP socket (SOCK_STREAM) with Internet Protocol Family (PF_INET). * Protocol family and Address family related. For example PF_INET Protocol Family and AF_INET family are coupled. */ socket_fd = socket(PF_INET, SOCK_STREAM, 0); if ( socket_fd < 0 ) { printf("socket call failed"); exit(0); } memset(&sa, 0, sizeof(struct sockaddr_in)); sa.sin_family = AF_INET; sa.sin_addr.s_addr = inet_addr(SENDER_IP_ADDR); sa.sin_port = htons(SENDER_PORT_NUM); ... Aber bei "struct sockaddr_in sa,ra,isa;" bekomme ich die Meldung: Error: storage size of 'sa' isn`t known. Ebenso bei ra und isa. Wenn ich mit der Maus auf "sockaddr_in" fahre erkennt er diesen und ich kann auch mit F3 zur deklaration springen. Auch AF_INET ist laut Compiler nicht deklariert, aber wenn ich es markiere und mit F3 hinspringe findet er es. Was muss ich noch einbinden bzw. was mache ich falsch?
Ich weiß nicht mit welcher Entwicklungsumgebung und mit welchen Build Tools du arbeitest. Wenn ich µC programmiere, nutze ich meistens ein Makefile für den Build Vorgang. Dort muss ich die Pfade zu den Includes und zu den Binären Libraries angeben. Die IDE (Netbeans, Eclipse, Qt Creator, ...) hat dafür wiederum eigene Projekteinstellungen. Das heisst: Wenn die IDE die Files findet, heisst das noch nicht unbedingt, dass der Compiler sie findet. Zu deiner Fehlermeldung sollte es aber noch eine weitere geben, die genau sagt, welche *.h Datei nicht gefunden wurde. Da der C Compiler bei vielen Fehlern trotzdem versucht, weiter zu machen, ist meistens die erste Meldung die wirklich relevante. Es wäre hilfreich, wenn du die ganze Ausgabe des Compilers zitieren würdest.
IDE und Compiler haben nichts miteinander zu tun. Selbst wenn die IDE das Symbol irgendwo herzieht und auflösen kann, dann muss es der Compiler nicht kennen. Der Compiler kennt nur, was über irgendein #include bekannt gemacht wird.
>Du kannst kein C... Danke! Ich habe schon ein paar Projekte hinter mir, aber im LwIP Stack blick ich noch nicht durch. > Der Compiler kennt nur, was über irgendein #include bekannt gemacht wird. Das weiß ich schon. #include <lwip/sockets.h> ist ja eingebunden und dort stehen auch die Deklarationen. Mich wundert deshalb warum der Compiler trotzdem meckert. -> Error: storage size of 'sa' isn`t known. Im müsste ja das struct bekannt sein. Daher die Frage ob außer "sockets.h" noch etwas anderes eingebunden muss. Ich steh da gerade auf dem Schalauch...
Offensichtlich weiss der Compiler nicht, was sockaddr_in ist. Suche doch mal die dessen Deklaration und kontrollieren, ob sie in der sockets.h enthalten ist (bzw. in anderen Dateien, die von sockets.h eingebunden werden). Und zitiere bitte die ganze Fehlermeldung.
Bastler schrieb: >>Du kannst kein C... > Danke! > Ich habe schon ein paar Projekte hinter mir, aber im LwIP Stack blick > ich noch nicht durch. > >> Der Compiler kennt nur, was über irgendein #include bekannt gemacht wird. > > Das weiß ich schon. > #include <lwip/sockets.h> ist ja eingebunden und dort stehen auch die > Deklarationen. Mich wundert deshalb warum der Compiler trotzdem meckert. > -> Error: storage size of 'sa' isn`t known. > > Im müsste ja das struct bekannt sein. Daher die Frage ob außer > "sockets.h" noch etwas anderes eingebunden muss. > Ich steh da gerade auf dem Schalauch... Ein Rat: Lerne C! Was Du schreibst, stimmt schonmal nicht. Mit C-Grundkenntnissen wüsstest Du, dass Deine Aussage falsch ist. In sockets.h (lwip 2.1.2):
1 | #if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ |
Also, ist LWIP_SOCKET bei Dir definiert?
In "opt.h" steht #define LWIP_Socket 1 Also ist es definiert. Mit Port 80 für HTTP funktioniert es ja, aber ich wollte noch weitere benutzen für einen einfachen Datenaustausch von ein paar Parametern für mein Gerät.
Was hat denn deine Struktur mit dem Port 80 zu tun, bzw. was macht dein Port 80 anders?
Bastler schrieb: > In "opt.h" steht #define LWIP_Socket 1 > Also ist es definiert. Ob das in opt.h steht, ist doch egal. Laut deinem Sourcecode in Posting 1 wird ja nur <lwip/sockets.h> includiert. Da kann doch in opt.h stehen was will...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.