2017-07-26 2 views
0

Ich bin neu in Signalen, ich versuche, SIGALRM auf UDP-Echo-Service, als eine Socket-Programmierung zu setzen.
Also hier habe ich einen UDP-Socket, der Client sendet eine Zeichenfolge an den Server und wartet auf Antwort (jede Antwort, hier wird die Zeichenfolge vom Server wiederholt).
Das Ziel ist, SIGALRM zu setzen und den Client einige Male erneut zu senden, wenn keine Antworten vom Server oder UDP-Pakete verloren gegangen sind.C - SIGALRM nicht empfangen

Hier habe ich eine kleine Probe und vereinfachte lange Linien mit ... können Sie weitere Details über meine github repo (Linie 51)

SIGALRM-client.c

unsigned int tries = 0; 

void CatchAlarm() 
{ 
    tries += 1; 
} 

int main(int argc, char **argv) 
{ 
    // SKIPPED 
    // ... 
    struct sigaction handler; 
    handler.sa_handler = CatchAlarm; 
    handler.sa_flags = 0; 
    if(sigfillset(&handler.sa_mask) < 0) 
     return 1; 

    if(sigaction(SIGALRM, &handler, 0) < 0) 
     return 2; 

    ssize_t bytes; 

    bytes = sendto(servSock,...); 

    while((bytes = recvfrom(servSock,...)) < 0) { 
     // alarm went off 
     if(errno == EINTR) { 
      // try 5 times 
      if(tries < 5) { 
       bytes = sendto(servSock,...); 
      } else { 
       fprintf(stdout, "no response, waiting...\n"); 
      } 
     } else { 
      fprintf(stdout, "failed to get data\n"); 
      return 3; 
     } 
    } 
    // recvfrom() got something, cancel timeout 
    alarm(0); 
    fprintf(stdout, "received %d bytes of data\n", bytes); 
    close(servSock); 
} 

erhalten Wenn ich den Client starte, wird er kein SIGALRM-Signal empfangen und UDP-Pakete gehen im ersten Versuch verloren!
Client wird nicht versuchen, die Zeichenfolge zu senden, dann wird er nach 5 Versuchen beendet, stattdessen wartet er auf Serverantwort für immer!
Was verhindert, dass Client SIGALRM bekommt?
Habe ich hier etwas verpasst?

+1

Sie haben eine Zeile 'alarm (0)'. Sofern ich etwas nicht verpasse, haben Sie den Alarm nie auf einen größeren Wert gesetzt, so dass Sie kein Alarmsignal erhalten. (Natürlich könnte es in dem Code enthalten sein, den Sie weggelassen haben, aber Sie sollten uns nicht kompilierbaren Code zeigen - wir brauchen einen MCVE ([MCVE]), der das Verhalten, nach dem Sie fragen, kompiliert und anzeigt.) –

+0

@ JonathanLeffler Du hast recht, ich hätte ein vollständiges und kompilierbares Sample schreiben sollen. Nun, ich denke, deine Erklärung ist klar genug, um eine Antwort zu sein, auch ohne vollständigen Code. Ich werde tiefer in die Signale gehen und mehr Aufmerksamkeit auf die alarm() Funktion lenken. Vielen Dank –

Antwort

2

Ihr Code im GitHub Repo ruft nie alarm() mit einer von Null verschiedenen Nummer auf. Sie werden nie ein Alarmsignal erhalten, das automatisch gesendet wird, es sei denn, Sie fragen es an. Wenn Sie sich auf einen anderen Prozess verlassen, um Ihren Prozess zu senden, ist ein Alarmsignal nicht belastbar.

Verwandte Themen