Forum: Mikrocontroller und Digitale Elektronik LwIP Problem mit Sockets


von Bastler (Gast)


Lesenswert?

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?

von John Doe (Gast)


Lesenswert?

Bastler schrieb:
> Was muss ich noch einbinden bzw. was mache ich falsch?

Du kannst kein C...

von Stefan F. (Gast)


Lesenswert?

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.

von PittyJ (Gast)


Lesenswert?

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.

von Bastler (Gast)


Lesenswert?

>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...

von Stefan F. (Gast)


Lesenswert?

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.

von John Doe (Gast)


Lesenswert?

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?

von Bastler (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

Was hat denn deine Struktur mit dem Port 80 zu tun, bzw. was macht dein 
Port 80 anders?

von PittyJ (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.