reconnexion en utilisant socket en c

im utilisant socket en c et obtenu le succès sur send / recv. Cependant, le problème vient du fait que mon serveur tombe en panne, le client doit le reconnecter (le serveur s’exécute après un certain temps). alors voici ce que j’ai fait:

  1. créer une prise
  2. relier
  3. recv / send
    • si recv size == 0, passez à l’étape 2.

cet algorithme ne fonctionne pas pour moi. y a-t-il des idées?

code:

int initSocket(char *servIP, unsigned short serverPort) { portNum = serverPort; ipAddr = servIP; /* Socket descriptor */ struct sockaddr_in echoServAddr; /* Echo server address */ if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { printf("socket() failed"); bConnected = -1; return -1; } /* Construct the server address structure */ memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */ echoServAddr.sin_family = AF_INET; /* Internet address family */ echoServAddr.sin_addr.s_addr = inet_addr(ipAddr); /* Server IP address */ echoServAddr.sin_port = htons(portNum); /* Server port */ struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 20000; if (setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0) error("setsockopt failed\n"); /*if (setsockopt (sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0) error("setsockopt failed\n"); */ /* Establish the connection to the echo server */ if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) { printf("connect() failed\n"); bConnected = -1; //close(sock); return -1; } bConnected = 0; return 0; } --------------- if server crashes ------------ if(recv_size == 0) { // server crashed while(initSocket(ipAddr, portNum) < 0) { printf("IP : %s\v", ipAddr); printf("Port : %d\v", portNum); } } ----------------------------- 

  1. créer une prise
  2. relier
  3. recv / send si recv size == 0 passez à l’étape 2.

Vous ne pouvez pas reconnecter un socket TCP, vous devez en créer un nouveau. Vous souhaitez également gérer le cas où recv ou envoyer des erreurs.

Donc, cela doit être:

  1. créer une prise
  2. relier
  3. recv / send si recv renvoie <= 0 ou si send renvoie -1 (et ce n'est pas un délai d'attente): socket proche, passez à l'étape 1

Cependant, il semble que votre code exécute déjà toutes ces étapes et ne se contente pas de répéter les étapes 2 et 3. Il est donc difficile de savoir quel est le problème réel que vous observez.

De plus, votre code initSocket () ne ferme pas () le socket lorsque connect () échoue. Vous risquez donc facilement de perdre des sockets et de manquer de descripteurs de fichier en moins d’une seconde lorsque le serveur est défaillant. le socket que vous venez de créer si vous ne l’utilisez pas.