LwIP Problem mit Sockets

Gast #5831517
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?
Gast #5831591
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.
Gast #5831597
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.
Gast #5831611
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...
Gast #5831615
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.
Gast #5831752
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?
Gast #5831819
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren