Partage
  • Partager sur Facebook
  • Partager sur Twitter

Winsock2 faire en sorte que le script ne s'arrête.

Comment forcer le programme à ne pas s'arrêter et garder la connection

Sujet résolu
Anonyme
13 mars 2022 à 14:18:22

Salut à toutes et à tous,

J'ai un petit problème, je souhaite faire en sorte que mon script C reste ouvert comme un programme jusqu'à ce qu'on lui dise de s'arrêter,

voici le client:

#include "headers.h"

int main(int argc, char **argv)
{
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server;

    printf("Initialising Winsock2...\n");
    if(WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        printf("Failed. Error Code : %d", WSAGetLastError());
        return 1;
    }
    printf("Initialised.\n");

    if((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d", WSAGetLastError());
        return 1;
    }
    printf("Socket created.\n");

    server.sin_addr.s_addr = inet_addr("192.168.0.13");
    server.sin_family = AF_INET;
    server.sin_port = htons(8888);

    // Connection to server and sending/receiving data
    if(connect(s, (struct sockaddr *)&server, sizeof(server)) != SOCKET_ERROR)
    {
        printf("Connected\n");
        // wait for the server's welcome message
        char serverWelcome[999];
        recv(s, serverWelcome, 998, 0);
        printf("%s\n", serverWelcome);
    }else
    {
        printf("Could not connect to server: %d\n", WSAGetLastError());
        return 1;
    }


    do
    {
        char in[999];
        char out[999];

        printf("Enter a command to send:\n");
        scanf("%s998", out);

        if(send(s, out, 998, 0) == SOCKET_ERROR)
        {
            printf("error sending command: %d\n", WSAGetLastError());
        }else if(recv(s, in, 998, 0) == SOCKET_ERROR)
        {
            printf("Error while receiving Server's data back: %d\n", WSAGetLastError());
        }else
        {
            recv(s, in, 998, 0);
            printf("%s\n", *in);
        }
    }while(1);

    closesocket(s);
    WSACleanup();

    return 0;
}


et voici le serveur:

#include "headers.h"

int main(int argc, char **argv)
{
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server;
    struct sockaddr_in client;

    printf("Initialising Winsock2...\n");
    if(WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        printf("Failed. Error Code : %d\n", WSAGetLastError());
        return 1;
    }
    printf("Initialised.\n");

    if((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d\n", WSAGetLastError());
        return 1;
    }
    printf("Socket created.\n");

    server.sin_addr.s_addr = inet_addr("192.168.0.13");
    server.sin_family = AF_INET;
    server.sin_port = htons(8888);

    // Binding
    if(bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
    {
        printf("Bind failed with error code : %d\n", WSAGetLastError());
        return 1;
    }else
    {
        printf("Binded\n");
    }

    printf("Listening incomming connections..\n");
    listen(s, 3);

    // Accept connections
    int c = sizeof(struct sockaddr_in);
    SOCKET s2 = accept(s, (struct sockaddr *)&client, &c);
    if(s2 != SOCKET_ERROR || INVALID_SOCKET)
    {
        printf("Connection accepted with %s on port %d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
    }else
    {
        printf("Connection failed with %s on port %d reason : %s\n",inet_ntoa(client.sin_addr), ntohs(client.sin_port), WSAGetLastError());
    }

    //Reply a welcome message to the client to tell him that he is connected to the server
    char *message = "You are connected to the Server, this message is from the Server\n";
    send(s2, message, 998, 0);

    Sleep(900);

    do
    {
        char *in;
        char *out = "command received";
        recv(s2, in, 998, 0);

        if(in == "test")
        {
            send(s2, out, 998, 0);
            printf("received the command: %s", in);
        }
    }while(1);






/*
    while(1)
    {
        // Wait for data incomming from the client
        
        int recv_size = recv(s2, in, 998, 0);

        if(recv_size == SOCKET_ERROR)
        {
            printf("Error receiving client's data %d\n", WSAGetLastError());
            break;
        }else if(recv_size == 0)
        {
            printf("client disconnected\n");
            break;
        }else
        {
            printf("Command received: %s\n", in);
            out = "command \"test\" received successfuly !\n";
            send(s2, out, 998, 0);
        }
    }*/



    closesocket(s2);
    closesocket(s);
    WSACleanup();

    return 0;
}

J'ai essayé plusieurs choses mais... mon programme plante lorsque je fait une boucle while avec :

   while(1)
   {
        char *in;
        char *out = "command received";
        recv(s2, in, 998, 0);

        if(in == "test")
        {
            send(s2, out, 998, 0);
            printf("received the command: %s", in);
        }
   }


En gros, je ne sais pas comment faire pour que mon programme Server et client restent en fonctionnement (un peu comme une connection telnet/SSH, le serveur attend l'arrivée d'une commande et retourne un certain truc... le client attend que l'utilisateur envoie une commande au serveur...)

Merci de votre future aide,

Cordialement

-
Edité par Anonyme 13 mars 2022 à 14:19:50

  • Partager sur Facebook
  • Partager sur Twitter
13 mars 2022 à 17:12:16

Dans ta boucle, tu as char *in;
Où réserves-tu l'espace pour ton buffer d'entrée?

     if(in == "test")

On utilise strcmp pour comparer des chaînes.

De plus, ici tu compares des pointeurs, pas le contenu. Ils seront toujours différents.

-
Edité par PierrotLeFou 13 mars 2022 à 17:17:50

  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

Anonyme
13 mars 2022 à 17:24:20

Je suis une brêle pour gérer les chaines de caractères...

Tu peux m'expliquer et m'aider s'il te plaît ? :)

(ps: je vais utiliser strcmp ;))) )

Cordialement.

  • Partager sur Facebook
  • Partager sur Twitter
13 mars 2022 à 17:43:53

Dans ton client tu as:
        char in[999];
Je ne l'ai pas vu dans le serveur.
if(strcmp(in, "test") == 0) {
    // c'est pareil.
}
Cherches la doc pour strcmp.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

13 mars 2022 à 17:46:45

Hello,

Un exemple avec ton dernier code

#include <stdbool.h>

#define IN_SIZE 999

char *in=malloc(IN_SIZE);
if(!in) {
	puts("mémoire insuffisante");
	exit(0);
}
char *out = "command received";

while(true) {
	recv(s2, in, IN_SIZE-1, 0);    // pas certain pour le -1
	if(strcmp(in,"test")==0) {
		send(s2, out, strlen(out)+1, 0);
		printf("received the command: %s", in);
	}
}

-
Edité par edgarjacobs 13 mars 2022 à 17:48:39

  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

Anonyme
13 mars 2022 à 17:48:31

Okay mais... c'est quoi la différence entre...

char *truc;

char *truc2[100];

char **truc3;

etc... ?

Et pour la boucle programme... comment-dois-je faire ? mon programme plante si je met un while(1)...

Cordialement

  • Partager sur Facebook
  • Partager sur Twitter
13 mars 2022 à 17:55:08

char *truc;
Tu ne définis qu'un pointeur, pas d'espace.
char *truc2[100];
Tu as un tableau de 100 pointeurs.
char **truc3;
Tu as un pointeur vers un pointeur ...
edgarjacobs t'a montré comment faire.
Le problème n'est pas le while mais la réservation de mémoire.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

Anonyme
13 mars 2022 à 17:56:21

okkk merci je teste et je vois si j'ai un autre problème ! normalement non mais bon..

Merci !

Cordialement

  • Partager sur Facebook
  • Partager sur Twitter
14 mars 2022 à 9:01:02

Autres choses :

  • Le C n'est pas un langage de script, on parle plutôt de programme.
  • Ton code contient une erreur fondamentale de l'utilisation de TCP/IP.
  • Ligne 59 du client tu envoie un unique caractère à printf alors que tu spécifie une chaine ("%s"), de plus la chaine n'est pas terminée par 0.

-
Edité par markand 14 mars 2022 à 9:04:13

  • Partager sur Facebook
  • Partager sur Twitter

git is great because Linus did it, mercurial is better because he didn't.

Anonyme
18 mars 2022 à 15:00:35

Je l'ai dit, je suis enfin... j'étais une brêle pour tout ce qui est chaînes de caractère, et franchement le fait de dire "script" au lieu de "programme" franchement c'est du chipotage mais bon.

Tout fonctionne et j'ai appris des choses, Merci !

  • Partager sur Facebook
  • Partager sur Twitter