Bonjour à tous, je suis en train de coder un Serveur (multithreadé) / Client Tcp, serveur en perl et client en c++ pour un projet personnel. Cela fait plusieurs jours que je suis dessus et j'ai du mal à comprendre toutes les mécaniques de ce système.
En fait, j'ai mon serveur qui est censé recevoir une connexion > suivi d'un boucle qui attend un message et le réécrit vers le client. Si le message est "quit", on arrête tout.

Code Serveur en PERL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#Fonction qui lance un serveur TCP multithradé en écoute
#Parametre de la socket
my $serveur = IO::Socket::INET->new(LocalPort => 10000,
                                    Type      => SOCK_STREAM,
                                    Reuse     => 1,
                                    Listen    => 10)
or die "Impossible serveur tcp sur le port 10000 : $@\n"; 
 
#Met en stand-by le processus jusqu’à la connexion d’un nouvel utilisateur.
while (my $client = $serveur->accept()) {
  next if my $pid = fork;
  close($serveur); 
  #Le processus en charge du client attend que celui-ci saisisse une valeur au clavier
  while( 1 ) {
      $rep = <$client>;
      exit unless defined $rep;
      print $client "Commande recu : $rep\n";
    if ( $rep =~ "quit") {
        close($client);
	exit;
    }
 }

Mon client lui, est une classe cpp permettant une connexion/déconnexion/envoie/réceptions de données.
J'ai tenté d'adapter pas mal de code trouvé sur le net et beaucoup marche mais je ne peux pas faire plusieurs interactions entre mon client et mon serveur. Je me connecte, j'envoie et reçois des données une fois mais après cela, je ne peux plus faire communiquer mes deux interfaces.

Code Client en C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void TCP_CLIENT::RecvSERVEUR()
{
 
std::string tochar = "quit";
char *sendbuf = (char*)(tochar.c_str());
 
int iResult;
 
// Send an initial buffer
iResult = send(id_de_la_socket, sendbuf, (int) strlen(sendbuf), 0);
if (iResult == SOCKET_ERROR) {
    printf("send failed: %d\n", WSAGetLastError());
    closesocket(id_de_la_socket);
    WSACleanup();
}
 
    // shutdown the connection since no more data will be sent
    nombre_de_caractere = shutdown(id_de_la_socket, SD_SEND);
    if (nombre_de_caractere == SOCKET_ERROR) {
        printf("shutdown failed: %d\n", WSAGetLastError());
        closesocket(id_de_la_socket);
        WSACleanup();
    }
 
 do {
        for (int i=0; i<512; buffer3[i++]='\0'){}
        nombre_de_caractere = recv(id_de_la_socket, buffer3, 512, 0);
        if ( nombre_de_caractere > 0 )
            printf("Bytes received: %d,%s\n", nombre_de_caractere, buffer3);
        else if ( nombre_de_caractere == 0 )
            printf("Connection closed\n");
        else
            printf("recv failed: %d\n", WSAGetLastError());
 
    } while( nombre_de_caractere > 0 );
}

Donc mon pbl pour résumer :
Mon code fait :
  1. Connexion
  2. Communication (reception de données (1fois) envoie de données (1fois)
  3. Déconnexion

Si je veux qu'il fasse :
  1. Connexion
  2. Communication (reception de données (1fois) envoie de données (1fois)
  3. Communication (reception de données (1fois) envoie de données (1fois)(une 2éme fois)
  4. Déconnexion

Mon client plante, et me sort des erreur du type winsock 10058 et 10093. J'ai l'impression en voyant ces erreurs que c'est la fonction shutdown qui fait tout planter mais si je l’enlève, ça ne marche carrément plus !

Mon code fonctionne comme cela, mais donc il faut que je lance une socket pour chaque communications différents (ce qui est lourd/embêtant/et moche), ça me convient pour l'instant dans mon code, mais si quelqu'un pouvait m'aider à rendre mon code plus fonctionnel, ça ne serait que mieux !
Merci.