IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Discussion :

[C] Dialogue Client/Server


Sujet :

Développement

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Par défaut [C] Dialogue Client/Server
    Bonjour,

    Je viens de commencer les sockets et j'ai réalisé un modèle client/server qui peuvent dialoguer entre eux à tour de rôle.

    Tout d'abord j'aimerais savoir si ma programmation est correcte ce que je pourrais améliorer ou même complétement changer
    De même, est il préférable d'avoir un server qui reçoit les message des clients et les envoit ou alors est ce que chaque client doit être server ??

    Ensuite j'aimerais savoir si il est possible de ne pas devoir attendre pour recevoir un message de l'autre personne, exemple, dans mon programme le server envoit un message, s'affiche au client puis le server attend une réponse obligatoire du client pour continuer...

    Enfin, est ce que je peus lancer 3 programmes en même temps pour qu'ils puissent communiquer entre eux ??

    Client:
    Code : 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    #include<string.h>
    #include<winsock2.h>
    #pragma comment (lib, "ws2_32.lib")
    
    void Couleur(int);
    
    void main()
    {
    	WSADATA WSAData;
    	WSAStartup(MAKEWORD(2,0), &WSAData);
    	SOCKET sock, csock;
    	SOCKADDR_IN sin;
    
    	int tentative; //Nombre de tentative pour se connecter au server
    	char buffer[50]; //Message à envoyer
    	bool connection; //Terminer la connection
    
    	printf("\n\n\t\t\t\t   CLIENT\n");
    	printf("\t\t\t\t   ------\n\n");
    
    	sock = socket(AF_INET, SOCK_STREAM, 0);
    
    	sin.sin_addr.s_addr = inet_addr("127.0.0.1");
    	sin.sin_family      = AF_INET;
    	sin.sin_port        = htons(69);
    
    	tentative = 0;
    	do
    	{
    		connection = false;
    		csock = connect(sock, (SOCKADDR *)&sin, sizeof(sin)); //Connection au server
    
    		if(csock != SOCKET_ERROR)
    		{
    			printf("\n\n Connexion etablie...");
    
    			do
    			{
    				recv(sock, buffer, sizeof(buffer), 0); //Reçoit le message duserver
    
    				if(strcmp(buffer, "EXIT") != 0) //Le server envoit EXIT pour stopper le tchat
    				{
    					Couleur(12);
    					printf("\n\n Server : ");
    					Couleur(7);
    					printf("%s", buffer); //Affiche le message envoyer par le server
    
    					printf("\n * Message : ");
    					fflush(stdin);
    					gets(buffer);
    
    					send(sock, buffer, sizeof(buffer), 0); //Envoit un message au server
    				}
    
    			}while(strcmp(buffer, "EXIT") != 0);
    
    			connection = true;
    		}
    		else
    		{
    			printf("\n\n\a\t\t    ERREUR DE CONNECTION AVEC LE SERVER\n\n");
    			
    			tentative++;
    
    			printf(" Appuyer sur une touche pour essayer de vous connecter...");
    			getch();
    		}
    
    	}while(tentative < 3 && connection == false);
    
    	closesocket(sock); //Ferme le socket
    	WSACleanup(); //Ferme les WSA
    
    	printf("\n\n Appuyer sur une touche pour quitter...");
    	getch();
    }
    
    void Couleur(int color) 
    { 
    	HANDLE hcon = GetStdHandle(STD_OUTPUT_HANDLE); 
        SetConsoleTextAttribute(hcon, color); 
    }
    Server:
    Code : 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<winsock2.h>
    #pragma comment (lib, "ws2_32.lib")
    
    void Couleur(int);
    
    void main()
    {
    	WSADATA WSAData;
    	WSAStartup(MAKEWORD(2,0), &WSAData);
    	SOCKET sock, csock;
    	SOCKADDR_IN sin, csin;
    
    	int csinsize;
    	char buffer[50];
    	bool envois = false;
    
    	printf("\n\n\t\t\t\t   SERVER\n");
    	printf("\t\t\t\t   ------\n\n");
    
    	sock = socket(AF_INET, SOCK_STREAM, 0);
    
    	sin.sin_addr.s_addr    = INADDR_ANY;
    	sin.sin_family         = AF_INET;
    	sin.sin_port           = htons(69);
    
    	bind(sock, (SOCKADDR *)&sin, sizeof(sin));
    	listen(sock, 2);
    
    	printf(" Attente de connection avec le client...");
    	csinsize = sizeof(csin);
    
    	csock = accept(sock, (SOCKADDR *)&csin, &csinsize);
    	printf("\n Connexion etablie...\n\n");
    
    	if(csock != INVALID_SOCKET) //Si la connection est acceptée
    	{
    		do
    		{
    			printf("\n * Message : ");
    			fflush(stdin);
    			gets(buffer);
    
    			send(csock, buffer, sizeof(buffer), 0); //On envoit un message au client
    
    			recv(csock, buffer, sizeof(buffer), 0); //On attend une rèponse de la part du client
    
    			Couleur(14);
    			printf("\n\n Client : ");
    			Couleur(7);
    			printf("%s", buffer); //Affiche le message envoyé par le client
    
    		}while(strcmp(buffer, "EXIT") != 0); //Le client envoit EXIT pour stopper le tchat
    
    	}
    
    	closesocket(sock); //Ferme le socket
    	WSACleanup(); //Ferme le WSA
    
    	printf("\n Connexion terminee...\n\n");
    
    	printf("\n Appuyer sur une touche pour quitter...");
    	getch();
    }
    
    void Couleur(int color) 
    { 
    	HANDLE hcon = GetStdHandle(STD_OUTPUT_HANDLE); 
        SetConsoleTextAttribute(hcon, color); 
    }
    Merci

    Bonne soirée

  2. #2
    Membre Expert
    Avatar de Aramis
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Juin 2002
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Consultant en sécurité

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 493
    Par défaut
    Bonjour,

    Tout d'abord j'aimerais savoir si ma programmation est correcte ce que je pourrais améliorer ou même complétement changer
    De même, est il préférable d'avoir un server qui reçoit les message des clients et les envoit ou alors est ce que chaque client doit être server ??
    A ce que je sache il n'y a aucune regle en ce qui concerne le design des applications clients/serveurs. L'architecture client/serveur permet, en autre chose, de repartir les taches et les charges de travail. Personellement, le dernier systemes clients/servers que j'ai developpe fonctionne de la maniere suivante:
    - applicaiton maitre (client) : assigne des operations a des app servers.
    - application esclave (server) : execute les taches et renvoient les resultats au maitre. Le maitre archive les resultats.
    Donc dans mon cas, les applications s'echangent des donnes.

    Mais si on prend un systeme de messagerie instantanee du style MSN Messenger ou bien Yahoo! eh bien le serveur se charge d'identifie les utilisateurs et de rediriger les communications. Normalement, chaque phrase de la conversation est envoye au server qui lui se charge de les retransmettre au(x) destinataire(s).

    Pour terminer, les architectures client et server sont tres similaires. En gros, le server a une section d'ecoute bloquante (pour les servers utilisants le protocol TCP ) Mais une chose est sure, c'est que l'ecoute se fait toujours d'une maniere active (boucle infinie, thread et etc.) et la transmission toujours de maniere ponctuelle.

    Bon courage,

    Ar@mi$

  3. #3
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Enfin, est ce que je peus lancer 3 programmes en même temps pour qu'ils puissent communiquer entre eux ??
    Oui tu peux lancer 3 programmes sur ta machine vu comment tu as codé le tout.

    Le seul problème comme souligne Aramis, c'est qu'il faut communiquer le message du client A vers le client B, et c'est le serveur qui peut s'en charger (le client aussi, mais généralement c'est le serveur qui s'en occupe)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Par défaut
    Justement, comment faut il faire pour que le clientA envois un message vers le clientB en passant par le server car lorsque je démarre 2 client et un server seul le clientA reçoit le message qu'il a envoyé.

  5. #5
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Le serveur doit sauvegarder les sockets ouverts, et envoyer le message reçu d'un socket pour l'envoyer sur tous les autres.

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/05/2012, 20h29
  2. [TClientSocket] Dialogue client/serveur Delphi 6
    Par Hikaru dans le forum Web & réseau
    Réponses: 6
    Dernier message: 31/03/2009, 10h28
  3. [Reseau] Dialogue client-serveur
    Par Nasky dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 08/08/2005, 15h07
  4. [réseau] [client/server] Transmettre la sortie standard
    Par legzo dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 30/06/2005, 16h15
  5. [ado][sql server] CLIENT/SERVER
    Par nil dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/04/2004, 08h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo