Ich möchte eine simple nachricht über die TCP/IP PRotokoll schicken...
Der Code ist nicht gerade sauber rorgrammiert das ist mir bewusst aber
im Prinzip sollte das so funktionieren ? Mit Wireshark hab ich versucht
etwas zu empfangen aber iwie sehe ich da nichts. Es gibt keine
Fehlermeldung.
was meint ihr ?
Anpingen funktioniert die verbindung ist da.
mein Code:
1
#include<DAVE3.h> //Declarations from DAVE3 Code Generation (includes SFR declaration)
2
3
4
/*Local port waiting for packets*/
5
#define LOCAL_PORT_RECEIVE (45555)
6
/*Local port used to echo back the packet*/
7
#define LOCAL_PORT_TRANSMIT (45174)
8
/*Destination port of echoed packet*/
9
#define TRANSMIT_PORT_DESTINATION (45175)
10
structtcp_pcb*pcb_tr;
11
err_terr;
12
13
14
15
staticerr_t
16
close_con()
17
{
18
tcp_arg(pcb_tr,NULL);
19
tcp_sent(pcb_tr,NULL);
20
tcp_close(pcb_tr);
21
}
22
23
err_tConnected()
24
{
25
chardata[]="HELLO TCP WORLD";
26
27
err=tcp_write(pcb_tr,&data,20,0);
28
29
err=tcp_output(pcb_tr);//to make it send the data immediately
Hier fehlt auf den ersten Blick eine ganze Menge. Wo ist dein
Protokolltyp genannt? Es gibt keinen Listener. LwIP bietet hier
tcp_listen() an. Du sagst auch nichts genaueres von wo nach wohin du
senden willst.
Schon hier geguckt?
http://lwip.wikia.com/wiki/Raw/TCP
okey das Listener wusste ich jetzt nicht :S
ich sende doch an die Adresse serverIP ?
auf der seite war ich mal glaub ich ...
okey ich schaue mir das mal noch mal an...
void TCP_CONNECTION_INIT(void)
{
struct tcp_pcb *pcb;
/* Create a new TCP control block */
pcb = tcp_new();
/* Assign to the new pcb a local IP address and a port number */
/* Using IP_ADDR_ANY allow the pcb to be used by any local interface
*/
tcp_bind(pcb, IP_ADDR_ANY, PORT);
/* Set the connection to the LISTEN state */
pcb = tcp_listen(pcb);
/* Specify the function to be called when a connection is established
*/
tcp_accept(pcb, Hello_Accept);
}
void Hello_Accept(void *arg, struct tcp_pcb *tpcb, err_t err)
{
tcp_arg(pcb, mem_calloc(sizeof(struct name), 1));
tcp_recv(pcb, tcp_receive_handler);
}
verstehe ich das richtig? Es gibt zwei arten eine Verbindung aufzubauen,
aktive und passive.
http://lwip.wikia.com/wiki/Raw/TCP
die Aktive ist, ich baue die Verbindung direkt auf und die passive,
wartet drauf bis eine Verbindung von ausen kommt.
Die Funktion die ich gepostet habe siehe oben.
TCP_CONNECTION_INIT(); wäre die Passive variante korrekt ?
Egal ob aktiv oder passiv, in beiden Fällen brauchst du eine
Hauptschleife, in der der lwIP Stack möglichst häudig aufgerufen wird,
sowie einen Timer, der regelmäßig alle 250ms aufgerufen wird.
Hintergrund ist der:
In der Hauptschleife überprüft der Stack durch Hardwarezugriffe, ob ein
Paket empfangen wurde. Wenn ja, dann wird es verarbeitet.
Der Timer ist wiederum dafür verantwortlich, dass zeitgesteuerte Dinge
zum richtigen zeitpunkt passieren. Zum beispiel die Wiederholung eines
Sendevorgangs, wenn der Empfänger nicht antwortet.
Bei µIP konnte der Timer wahlweise im Interrupt abgearbeitet werden,
oder in der Hauptschleife, was die bevorzugte Methode war. Der
Timer-Interrupt hat dann nur alle 250ms ein Flag gesetzt das "die zeit
ist abgelaufen" bedeutete. In der Hauptschleife wurde dieses Flag bei
jedem Durchlauf abgefragt und wenn das Flag gesetzt war, wurde die
Timer-Funktion von µIP aufgerufen.
Bei lwIP könnte das ein bisschen anders ablaufen - ich kenne mich damit
nicht aus. Aber ganz sicher brauchst du eine Hauptschleife, welche lwIP
möglichst oft aufruft. Denn je seltener du lwIP aufrufst, umso langsamer
wird es. Wenn du gar keine Hauptschleife hast, werden nur ganz primitive
Sachen funktionieren, wie das Senden eines einzelnen UDP Paketes ohne
Wiederholung und ohne Verarbeitung der Response.
JAp das ist korrekt. Steht auch im Wiki genau so drin,
After lwip_init() is called, you must call tcp_tmr() every
TCP_TMR_INTERVAL milliseconds (default is 250 milliseconds).
Hast du dir auch schonmal die generelle TCP-Statemachine angesehen?
http://de.wikipedia.org/wiki/Transmission_Control_Protocol#Verbindungsaufbau_und_-abbau
Anhand dessen kannst du dir auch die fertigen Beispiele ansehen und
vergleichen. Das hilft schonmal nur zum Verständnis des Protokolls. Und
dann kannst du dir die Eigenheiten von LwIP noch einmal zu Gemüte
führen.
CSS mit Media Queries und Image Sets hab ich in der Richtung erstmal
links ligeen lassen. Ist auf tigion.de ja testweise nur ne reine
Javascript Lf6sung die auf window.devicePixelRatio basiert.Egal ob
geringer Marktanteil und so neue Techniken probiere ich halt gern aus.
dcbrigens sieht es schon verdammt gut auf einem iPad 3/4 aus, wenn die
Grafiken entsprechend hochauflf6send sind. Danach hatte ich das Geffchl
alles andere im WWW we4re leicht unscharf.