lwIP einfache Hello Word string senden.

Gast #4026838
Lesenswert?
• ▲
▼
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
struct tcp_pcb *pcb_tr;
11
err_t err;
12

13

14

15
static err_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_t Connected()
24
{
25
    char data[] = "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
30

31
    tcp_sent(pcb_tr, close_con);
32
    return err;
33
}
34

35
struct tcp_pcb * tcp_init_comm(unsigned int port) {
36
  /* start the TCP server */
37
  struct tcp_pcb *pcb;
38
  /* create new TCP PCB structure */
39
  pcb_tr = tcp_new();
40
  tcp_bind(pcb_tr, IP_ADDR_ANY, port);
41
    return pcb_tr;
42

43
}
44

45
int main(void)
46
{
47
  DAVE_Init();      // Initialization of DAVE Apps
48
  lwIPStack_init();    //Start Lwip stack
49

50
  struct ip_addr serverIP;
51
  uint16_t bufspace;  
52

53
  IP4_ADDR( &serverIP, 192, 168, 0, 40);  //PC
54

55
  //Create
56
  pcb_tr=tcp_init_comm(TRANSMIT_PORT_DESTINATION);
57
  
58

59
  //Connect
60
    if(pcb_tr != NULL)
61
      err = tcp_connect(pcb_tr, &serverIP,TRANSMIT_PORT_DESTINATION,0);
62
    
63
    if (err == ERR_OK)
64
      bufspace = tcp_sndbuf(pcb_tr);
65

66
    if (bufspace)
67
        err = Connected();
68

69

70
  while(1)
71
  {
72

73
        
74
  }
75
  return 0;
76
}
Gast #4027109
Lesenswert?
• ▲
▼
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);
}
Gast #4028051
Lesenswert?
• ▲
▼
@Stefan du meinst die funktion tcp_tmr() die alle 250ms aufgerufen 
werden muss ?

so zBsp. :

#define SYSTEMTICK_PERIOD_MS  10

/*tcp.h */
#define TCP_TMR_INTERVAL       250  /* The TCP timer interval in 
milliseconds. */


void Time_Update(void)
{
  LocalTime += SYSTEMTICK_PERIOD_MS;
}

void LwIP_Periodic_Handle(__IO uint32_t localtime)
{

  /* TCP periodic process every 250 ms */
  if (localtime - TCPTimer >= TCP_TMR_INTERVAL)
  {
    TCPTimer =  localtime;
    tcp_tmr();
  }
}
void System_Periodic_Handle(void)
{

  LwIP_Periodic_Handle(LocalTime);
}


while(1){
System_Periodic_Handle();
}
Gast #4028107
Lesenswert?
• ▲
▼
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.
Gast #4386147
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.