LwIP Problem mit Sockets

Gast #5831517
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
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
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
>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
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
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
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.
Gast #5832242
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...

Antwort schreiben

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.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.