W5100 reagiert auf TCP-Paket mit RST-Flag

Gast #921116
Lesenswert?
• ▲
▼
Hallo,
ich steuere einen W5100 Ethernet-Controller mit einem AT91SAM7X256 an. 
Ich kann ohne Probleme seine Register schreiben und lesen. Der W5100 
reagiert auch richtig auf ARPs und Pings. Aber wenn eine TCP-Verbindung 
eingehen will, bricht er immer ab.

In Wireshark kann ich immer sehen, dass mein Recher ein TCP-Paket mit 
einem SYN-Flag schickt und das Board in der Antwort das RST-Flag gesetzt 
hat.

Der Code meines TCP-Servers sieht so aus:
1
void tcps(
2
  HU8 ch  /**< channel(socket) index */
3
  )
4
{
5
  int len;  
6
  int wait_send = 0;                                                
7
  HU8 * data_buf = (HU8*) RX_BUF;
8
  SOCKET kanal = ch;
9
  HU16 port;
10
  HU32 addr;
11

12
  HU8 sr = getSn_SR(ch);
13
  //switch (getSn_SR(ch))
14
  switch(sr)
15
  {
16
    /* WENN VERBINDUNG HERGESTELLT IST: */
17
    case SOCK_ESTABLISHED:                                      
18
    if(bchannel_start[ch]==1)
19
    {
20
      printf("%d: Verbunden", ch);
21
      bchannel_start[ch] = 2;
22
    }
23
    if ((len = getSn_RX_RSR(ch)) > 0) /* RX Daten prüfen */
24
    {
25
       /* Überlauf verhindern */
26
      if (len > TX_RX_MAX_BUF_SIZE) len = TX_RX_MAX_BUF_SIZE; 
27
      len = recv(ch, data_buf, len); /* Daten empfangen */
28
      bio_set_blip20(1);
29
      DatenAuswerten(data_buf, len); /* Daten auswerten */
30
      send(ch, data_buf, strlen(data_buf)); /* Antworten */
31
      while(getSn_TX_FSR(ch)!= getIINCHIP_TxMAX(ch)) //solange TX nicht leer
32
      {
33
        if(wait_send++ > 150)
34
        {
35
#ifdef WEB_DEBUG  
36
          printf( "HTTP Response send fail");
37
#endif        
38
          break;
39
        }
40
        idle(SEC(0.01));
41
      }
42
      disconnect(ch);
43
    }
44
    break;
45

46
    /* WENN DER CLIENT BEANTRAGT HAT, ZU SCHLIESSEN: */
47
    case SOCK_CLOSE_WAIT:                               
48
    printf("%d : CLOSE_WAIT\r\n", ch);
49
    disconnect(ch); /* Verbindung schließen */
50
    bchannel_start[ch] = 0;
51

52
    /* WENN DER SOCKET GESCHLOSSEN IST */
53
    case SOCK_CLOSED:                                           
54
    if(bchannel_start[ch] == 0) 
55
    {
56
      printf("%d : TCP Server Started.\r\n",ch);
57
      bchannel_start[ch] = 1;
58
    }
59
    if(socket(ch,Sn_MR_TCP,80,0x00) == 0) /* Socket neu initialisieren */
60
    {
61
      printf("\a%d : Fail to create socket.\r\n",ch);
62
      bchannel_start[ch] = 0;
63
    }
64
    else
65
      listen(ch); /* auf Anfragen warten lassen */
66
    break;
67
  }
68
}

Hat jemand ne Idee, warum der W5100 kein ACK schickt, sondern immer nur 
ein RST?
#921156
Lesenswert?
• ▲
▼
Hallo,

wenn in TCP auf ein SYN mit einem RST geantwortet wird deutet das darauf 
hin auf den Port kein Listener sich befindet. Lauscht dein Server auf 
einem Port. Ich sehe leider nicht die Initialisierung dafür. HTTP-Server 
lauschen z.B. auf Port 80. Schau mal in Wikipedia unter TCP und HTTP 
nach.

CA Dirk
Gast #921315
Lesenswert?
• ▲
▼
Nein. Das Netzwerk arbeitet schpon richtig. Was ich meinte ist, wo sagst 
du deinem Server auf welchen TCP-Port er reagieren soll. Das ist 
wichtig, das TCP nach dem Portprinzip arbeitet. Von diesen Port wird 
meistens auch das Protokoll abgeleitet, wie in deinem Fall HTTP für 
Webserver.
Du müsstest in diesem Fall also erst mal festlegen auf welchen TCP-Port 
er Verbindungen annehmen soll. Und dann kannst du abfragen ob auf diesen 
Port eine neue Verbindung eingegangen ist und diese dann ensprechend 
bearbeiten.

CA Dirk
Gast #921819
Lesenswert?
• ▲
▼
Danke für eure Zeit.

Die erste Initialisierung habe ich da jetzt nicht hingeschrieben, aber 
sie sieht genauso aus, wie der Code beim Neueinrichen, also wie bei case 
SOCK_CLOSED:
1
socket(ch,Sn_MR_TCP,80,0x00);
2
listen(ch);
Also: TCP, Port 80, listen

Und diese Errata bezieht sich anscheinend nur auf UDP.
Gast #922020
Lesenswert?
• ▲
▼
Ich bin nochmal alle Registerbeschreibungen durchgegangen. Im 
Socket-Mode-Register habe ich dann noch ein Bit gesetzt, was "Use No 
Delayed ACK" heißt. Jetzt habe ich schon mal zwei bis drei 
Drei-Wege-Handshakes und erst danach die RSTs.

Vielleicht machten aber auch andere Tasks in diesem OS Ärger. Kann es 
sein, dass der Wiznet einfach ein RST zurückschickt, wenn die Daten nach 
x ms nicht aus dem RX-Buffer gelesen wurden?
Gast #1129222
Lesenswert?
• ▲
▼
Hi,
ich hab ein ähnliches Problem,
bei mir werden Daten zum Easy-TCP/IP-Server gesendet, und die kommen 
auch zu 70% an. Aber ab und zu geht das Wiznet-Teil gleich in 
Close_Wait-Stellung wenn das Paket reinkommt. Ich hab auch die 
Vermutung, dass man in einer bestimmten Zeit den Buffer auslesen muss. 
Sonst bricht das Wiznet die Verbindung ab.
Hast du vielleicht diesbezüglich etwas herausgefunden?

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.