mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik W5100 reagiert auf TCP-Paket mit RST-Flag


Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void tcps(
  HU8 ch  /**< channel(socket) index */
  )
{
  int len;  
  int wait_send = 0;                                                
  HU8 * data_buf = (HU8*) RX_BUF;
  SOCKET kanal = ch;
  HU16 port;
  HU32 addr;

  HU8 sr = getSn_SR(ch);
  //switch (getSn_SR(ch))
  switch(sr)
  {
    /* WENN VERBINDUNG HERGESTELLT IST: */
    case SOCK_ESTABLISHED:                                      
    if(bchannel_start[ch]==1)
    {
      printf("%d: Verbunden", ch);
      bchannel_start[ch] = 2;
    }
    if ((len = getSn_RX_RSR(ch)) > 0) /* RX Daten prüfen */
    {
       /* Überlauf verhindern */
      if (len > TX_RX_MAX_BUF_SIZE) len = TX_RX_MAX_BUF_SIZE; 
      len = recv(ch, data_buf, len); /* Daten empfangen */
      bio_set_blip20(1);
      DatenAuswerten(data_buf, len); /* Daten auswerten */
      send(ch, data_buf, strlen(data_buf)); /* Antworten */
      while(getSn_TX_FSR(ch)!= getIINCHIP_TxMAX(ch)) //solange TX nicht leer
      {
        if(wait_send++ > 150)
        {
#ifdef WEB_DEBUG  
          printf( "HTTP Response send fail");
#endif        
          break;
        }
        idle(SEC(0.01));
      }
      disconnect(ch);
    }
    break;

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

    /* WENN DER SOCKET GESCHLOSSEN IST */
    case SOCK_CLOSED:                                           
    if(bchannel_start[ch] == 0) 
    {
      printf("%d : TCP Server Started.\r\n",ch);
      bchannel_start[ch] = 1;
    }
    if(socket(ch,Sn_MR_TCP,80,0x00) == 0) /* Socket neu initialisieren */
    {
      printf("\a%d : Fail to create socket.\r\n",ch);
      bchannel_start[ch] = 0;
    }
    else
      listen(ch); /* auf Anfragen warten lassen */
    break;
  }
}

Hat jemand ne Idee, warum der W5100 kein ACK schickt, sondern immer nur 
ein RST?

Autor: Dirk Broßwick (sharandac)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: WizNet (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Handelt es sich um den Fehler in der Anlage? Tritt wohl immer auf, wenn 
gleichzeitig gesendet und empfangen wird - oder?

Autor: Dirk Broßwick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
socket(ch,Sn_MR_TCP,80,0x00);
listen(ch);
Also: TCP, Port 80, listen

Und diese Errata bezieht sich anscheinend nur auf UDP.

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: AVRHacker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.