Frage zu Socket
-
Hallo,
ich versuche mich gerade mit der Programmierung von Sockets. Im Anhang habe ich einen kleinen Ausschnitt aus meinem Code.
Nun zu meiner Frage. Ich erstelle ein Clienttool, welches über socket(...) ein Socket erstellt und über connect(...) dann die Verbindung zum Server aufbaut. Das ganze funktioniert auch so lange, wie der Server da ist. Wenn jedoch die Verbindung zum Server kurz ausfällt, dann steht die Verbindung auch nicht mehr.
Gibt es Möglichkeiten, das sich das Socket selbst überwacht, bei Verbindungsabbruch solange versucht die Verbindung wieder aufzubauen bis der Server da ist, und wie kann man so etwas realisieren? Es wäre nett wenn ihr mir hier weiterhelfen könntet.
Hier ein kleiner Ausschnitt:
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <arpa/inet.h> #include <errno.h> #include <string.h> int main(int argc, char **argv){ int c; int sockfd = 0; int conresult = 0; int portnr = 0; char *ipaddress=NULL, *fifoname=NULL; struct sockaddr_in address; while((c = getopt(argc,argv,"p:i:")) != -1){ switch(c){ case 'p': portnr = atoi(optarg); break; case 'i': ipaddress = optarg; break; default: abort(); } } if(portnr == 0){ portnr = 80; } if(ipaddress == NULL){ ipaddress = "127.0.0.1"; } if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0){ perror("oops: Cannot create socket"); exit(1); } address.sin_family = AF_INET; address.sin_port = htons(portnr); inet_aton(ipaddress,&address.sin_addr); if((conresult = connect(sockfd,(struct sockaddr*) &address, sizeof(address))) == -1){ perror("oops: Cannot connect to socket"); exit(1); } printf("\e[2J"); printf("Port : %d\nIP : %s\nFIFO : %s\nsocketfd : %d\n",portnr,ipaddress,fifoname,sockfd); if(conresult == 0){ printf("Verbindung hergestellt!\n"); } close(sockfd); return EXIT_SUCCESS; }
mfg
Reiner
-
Rebelhig schrieb:
Gibt es Möglichkeiten, das sich das Socket selbst überwacht, bei Verbindungsabbruch solange versucht die Verbindung wieder aufzubauen bis der Server da ist, und wie kann man so etwas realisieren? Es wäre nett wenn ihr mir hier weiterhelfen könntet.
Du kannst doch einfach eine neue Verbindung aufbauen, wenn die Verbindung getrennt wurde. Das kannst du so lange versuchen, bis die Verbindung wieder steht.
Übrigens: Kleine Verbindungsunterbrechungen kann TCP selber korregieren.
-
ProgChild schrieb:
Du kannst doch einfach eine neue Verbindung aufbauen, wenn die Verbindung getrennt wurde. Das kannst du so lange versuchen, bis die Verbindung wieder steht.
Übrigens: Kleine Verbindungsunterbrechungen kann TCP selber korregieren.Danke erst einmal für die schnelle Antwort. Vielleicht habe ich eine Denkblockade, wie kann ich denn feststellen dass der Abbruch vom Socket kommt? Ein Verbindungsabbruch kann mnanchmal mehrere Stunden sein, da der Server im Ausland steht und das Netz dort nicht so stabile läuft.
Reiner
-
Wenn du poll benutzt, dann kannst du dir das HUP (Hang Up) Event ausgeben lassen. Sonst kannst du bei blockierenden Sockets feststellen, ob die Verbindung getrennt wurde, wenn dir recv 0 Bytes empfängt, also 0 zurück gibt.