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


von Carolin Z. (seobalis)


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
1
#define MAX 1024
2
#define SERVER_PORT 5000
3
int main(){
4
int sockfd;
5
  int byte;
6
  uint8 puffer[MAX];
7
  uint8 *cpData;
8
  sockfd = create_socket(AF_INET, SOCK_DGRAM, 0);
9
  printf("create a socket\n");
10
  bind_socket(&sockfd, "168.100.0.1", SERVER_PORT);
11
  while(1){
12
    memset(puffer, 0, MAX);
13
    while((byte = UDP_recv(&sockfd, puffer, MAX)) >0){
14
      puffer[byte] = '\0';
15
      cpData = puffer;
16
      cpData = check1(cpData);
17
      if(return_code != RETURN_OKAY)
18
      continue;
19
      printf("check1 korrekt\n");
20
      cpData += 8;  
21
      cpData = check2(cpData);  
22
      if(return_code != RETURN_OKAY)
23
      continue;
24
       printf("check2 korrekt\n");
25
       UDP_send(&sockfd, puffer, byte, "168.100.0.155", 5001);
26
    }  
27
  }
28
  
29
  ///return to main
30
  return 0;
31
}

von Bernhard M. (boregard)


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?
1
UDP_send(&sockfd, puffer, byte, "168.100.0.155", 5001);
 wird nie gerufen, wenn return_code != RETURN_OKAY....

von Carolin Z. (seobalis)


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
1
int create_socket(int domain, int type, int protokoll){
2
int sock;
3
sock = socket(domain, type, protokoll);
4
if(sock < 0){
5
perror("socket()");
6
exit(10);
7
}
8
return sock;
9
10
}
> Kann es sein, daß dein Client erst wieder Daten schickt, wenn er eine
> Bestätigung bekommen hat?
>
1
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
1
#define MAX 1024
2
#define SERVER_PORT 5000
3
int main(){
4
int sockfd;
5
  int byte;
6
  uint8 puffer[MAX];
7
  uint8 *cpData;
8
  sockfd = create_socket(AF_INET, SOCK_DGRAM, 0);
9
  printf("create a socket\n");
10
  bind_socket(&sockfd, "168.100.0.1", SERVER_PORT);
11
  while(1){
12
    memset(puffer, 0, MAX);
13
    while((byte = UDP_recv(&sockfd, puffer, MAX)) >0){
14
      puffer[byte] = '\0';
15
      cpData = puffer;
16
      cpData = check1(cpData);
17
//Wenn return_code in der Funktion check1 gesetzt wird
18
     
19
      printf("hier noch??");
20
21
      //diese "hier noch??" wird noch ausgegeben
22
 
23
      if(return_code != RETURN_OKAY)//diese Zeile wird nicht gearbeitet
24
      continue;
25
      printf("check1 korrekt\n");
26
      cpData += 8;  
27
      cpData = check2(cpData); //hier auch genauso 
28
      if(return_code != RETURN_OKAY)
29
      continue;
30
       printf("check2 korrekt\n");
31
       UDP_send(&sockfd, puffer, byte, "168.100.0.155", 5001);
32
    }  
33
  }
34
  
35
  ///return to main
36
  return 0;
37
}

von Bernhard M. (boregard)


Lesenswert?

na ja...
1
      printf("hier noch??");
2
3
      //diese "hier noch??" wird noch ausgegeben
4
 
5
      if(return_code != RETURN_OKAY)//diese Zeile wird nicht gearbeitet
6
      continue;
7
      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...

von Carolin Z. (seobalis)


Lesenswert?

Ja. Ich habe vergessen den return_code zu löschen wenn er gesetzt wird.

Vielen Danke für die Antwort.

Carolin

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.