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 */
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.
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...
Eine eigene Frage?
Dieser Thread ist über 7 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.