mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C/C++ UDP Server


Autor: Carolin Zapa (seobalis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
ich bin wieder. Ich habe folgende Code geschrieben. Es läuft alles gut 
wenn return_code== RETURN_OKAY.
Die Daten wird immer gescheckt. Wenn eine fertig ist dann wird 2.Daten 
kommen und wieder überprüfen usw.
Es läuft aber nicht mehr Wenn return_code != RETURN_OKAY dann hängt mein 
Programm. Ich weiß gerade nicht wo das Problem liegt.
Es wäre nett wenn ihr mir das zeigen könnte.

Carolin
#define MAX 1024
#define SERVER_PORT 5000
int main(){
int sockfd;
  int byte;
  uint8 puffer[MAX];
  uint8 *cpData;
  sockfd = create_socket(AF_INET, SOCK_DGRAM, 0);
  printf("create a socket\n");
  bind_socket(&sockfd, "168.100.0.1", SERVER_PORT);
  while(1){
    memset(puffer, 0, MAX);
    while((byte = UDP_recv(&sockfd, puffer, MAX)) >0){
      puffer[byte] = '\0';
      cpData = puffer;
      cpData = check1(cpData);
      if(return_code != RETURN_OKAY)
      continue;
      printf("check1 korrekt\n");
      cpData += 8;  
      cpData = check2(cpData);  
      if(return_code != RETURN_OKAY)
      continue;
       printf("check2 korrekt\n");
       UDP_send(&sockfd, puffer, byte, "168.100.0.155", 5001);
    }  
  }
  
  ///return to main
  return 0;
}

Autor: Bernhard M. (boregard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Abgesehen davon, daß der Code nicht gerade übersichtlich formatiert ist 
(gut, es gibt schlimmeres) und die gerufenen Funktionen fehlen....
Kann es sein, daß dein Client erst wieder Daten schickt, wenn er eine 
Bestätigung bekommen hat?
UDP_send(&sockfd, puffer, byte, "168.100.0.155", 5001);
 wird nie gerufen, wenn return_code != RETURN_OKAY....

Autor: Carolin Zapa (seobalis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernhard M. wrote:
> Abgesehen davon, daß der Code nicht gerade übersichtlich formatiert ist
> (gut, es gibt schlimmeres) und die gerufenen Funktionen fehlen....
In der gerufen Funktion(check1 und check2) werden die Daten nur 
verglichen und return_code wird gesetzt(also nicht mehr RETURN_OKAY) 
wenn nicht gleich
die andere Funktionen wie create_socket sind ähnlich(nur die Befehle 
unterschiedlich) wie z.B
int create_socket(int domain, int type, int protokoll){
int sock;
sock = socket(domain, type, protokoll);
if(sock < 0){
perror("socket()");
exit(10);
}
return sock;

}
> Kann es sein, daß dein Client erst wieder Daten schickt, wenn er eine
> Bestätigung bekommen hat?
>
UDP_send(&sockfd, puffer, byte, "168.100.0.155", 5001);
 wird nie
> gerufen, wenn return_code != RETURN_OKAY....

Der Client wird die Daten immer schicken auch wenn der keine Bestätigung 
bekommt.
Nur die bestimmte Daten soll wieder zu Client geschickt werden


Wenn ich ein Test unter cpData = Check1(..) wie folgt mache
#define MAX 1024
#define SERVER_PORT 5000
int main(){
int sockfd;
  int byte;
  uint8 puffer[MAX];
  uint8 *cpData;
  sockfd = create_socket(AF_INET, SOCK_DGRAM, 0);
  printf("create a socket\n");
  bind_socket(&sockfd, "168.100.0.1", SERVER_PORT);
  while(1){
    memset(puffer, 0, MAX);
    while((byte = UDP_recv(&sockfd, puffer, MAX)) >0){
      puffer[byte] = '\0';
      cpData = puffer;
      cpData = check1(cpData);
//Wenn return_code in der Funktion check1 gesetzt wird
     
      printf("hier noch??");

      //diese "hier noch??" wird noch ausgegeben
 
      if(return_code != RETURN_OKAY)//diese Zeile wird nicht gearbeitet
      continue;
      printf("check1 korrekt\n");
      cpData += 8;  
      cpData = check2(cpData); //hier auch genauso 
      if(return_code != RETURN_OKAY)
      continue;
       printf("check2 korrekt\n");
       UDP_send(&sockfd, puffer, byte, "168.100.0.155", 5001);
    }  
  }
  
  ///return to main
  return 0;
}

Autor: Bernhard M. (boregard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na ja...
      printf("hier noch??");

      //diese "hier noch??" wird noch ausgegeben
 
      if(return_code != RETURN_OKAY)//diese Zeile wird nicht gearbeitet
      continue;
      printf("check1 korrekt\n");
die Zeile if(return_code... wird natürlich abgearbeitet, aber der 
printf("check1 korrekt\n"); kommt nicht mehr wegen dem continue 
darüber...

Autor: Carolin Zapa (seobalis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja. Ich habe vergessen den return_code zu löschen wenn er gesetzt wird.

Vielen Danke für die Antwort.

Carolin

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.