begin process at 2012 05 29 14:08:16
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Réseau & Internet

 > 

problème chat


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

problème chat

dimanche 4 avril 2010 à 18:42:44 | problème chat

Adict


salut tout le monde

alors j'ai commencé depuis peu à vouloir créer un "chat" simple.

j'utilise donc les sockets qui marchent mais j'ai 2 questions ou plutôt 2 problèmes


1) je n'arrive pas bien à comprendre comment gérer les sockets "send" et "recv"...

Je m'explique. Dans le client je doit taper une phrase et l'envoyer sur le serveur qui lui même renvoi la phrase sur touts les clients qui sont connectés,
mais je ne sais pas comment mettre ça en place

j'avais pensé à : send(s, "%s : %s ", pseudo, chaine, 0); mais ça ne marche pas :(

puis ensuite il faut la commande pour que le serveur reçoive et renvoi cette chaine de caractères.



2) quand je fait se connecter un client au serveur ça marche :) mais discuter tout seul ça ne sera pas drôle :( donc lorsque que je lance 2x le client le premier marche et le serveur dit "l'ip xxxx vient de se connecter" mais pour le 2 ème c'est un écran noir... Car à mon avis le serveur ne reste pas à l'écoute



voici la source:

Client.C
Code C/C++ :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <string.h>
#include <winsock2.h>

static void purger(void)
{
    int c;

    while ((c = getchar()) != '\n' && c != EOF)
    {}
}

static void clean (char *chaine)
{
    char *p = strchr(chaine, '\n');

    if (p)
    {
        *p = 0;
    }

    else
    {
        purger();
    }
}

int main(int argc, char *argv[])
{
    char chaine[500];
    char pseudo[30];
    
    printf("inserez votre pseudo\n\n"); 

    scanf("%s", &pseudo);
printf("\n\nBienvenu %s\n", pseudo);
getch();

system("CLS");
    
    
    WSADATA wsaData;

    if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
        fprintf(stderr, "La fonction WSAStartup a echoue.\n");
    else
    {
        SOCKET s;
        
        s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (s == INVALID_SOCKET)
            fprintf(stderr, "La fonction socket a echoue.\n");
        else
        {
            SOCKADDR_IN server;
            
            server.sin_family       = AF_INET;
            server.sin_addr.s_addr  = inet_addr("127.0.0.1");
            server.sin_port         = htons(5050);
            memset(&server.sin_zero, '\0', sizeof(server.sin_zero));
            
            if (connect(s, (SOCKADDR *)&server, sizeof(server)) == SOCKET_ERROR)
                fprintf(stderr, "La fonction connect a echoue.\n");
            else
            {
                char buffer[100];
                
                int n;
                
                n = recv(s, buffer, sizeof(buffer) - 1, 0); 
                
                if (n != SOCKET_ERROR)
                {
                    buffer[n] = '\0';
                    printf("%s", buffer);
                    
while (1)
{
printf("\n%s : ", pseudo);
 
    fgets(chaine, sizeof chaine, stdin);
    clean(chaine);
   
    printf("%s : %s ",pseudo, chaine); // on enlevera cela pour remplacer par un "send" au serveur qui renverra le message à chaque client connecté 
    
    if  ( strcmp( chaine, "exit" ) == 0 )
    { 

       goto fin; // je sais goto c'est pas bien mais c'est juste pour faire les testes en attendant :p 
        
    }  
}     
           fin: 
                    send(s, "Au revoir\n", (int)strlen("Au revoir\n"), 0); 
                    
                    
                }
                
                shutdown(s, SD_SEND);
            }
            
            closesocket(s);
        }
        
        WSACleanup();
    }
    
    return 0;
}




Serveur.C
Code C/C++ :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <string.h>
#include <winsock2.h>

static void purger(void)
{
    int c;

    while ((c = getchar()) != '\n' && c != EOF)
    {}
}

static void clean (char *chaine)
{
    char *p = strchr(chaine, '\n');

    if (p)
    {
        *p = 0;
    }

    else
    {
        purger();
    }
}

int main()
{
    
    WSADATA wsaData;

    if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
        fprintf(stderr, "La fonction WSAStartup a echoue.\n");
    else
    {
        SOCKET s_server;
        
        s_server = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (s_server == INVALID_SOCKET)
            fprintf(stderr, "La fonction socket a echoue.\n");
        else
        {
            SOCKADDR_IN server;
            
            server.sin_family       = AF_INET;
            server.sin_addr.s_addr  = htonl(INADDR_ANY);
            server.sin_port         = htons(5050);
            memset(&server.sin_zero, '\0', sizeof(server.sin_zero));
            
            if (bind(s_server, (SOCKADDR *)&server, sizeof(server)) == SOCKET_ERROR)
                fprintf(stderr, "La fonction bind a echoue.\n");
            else
            {
                if (listen(s_server, 0) == SOCKET_ERROR) /* listen : commencer l'ecoute */
                    fprintf(stderr, "La fonction listen a echoue.\n");
                else
                {
                    SOCKET s_client;
                    SOCKADDR_IN client;
                    int csize = sizeof(client);
                    
                    s_client = accept(s_server, (SOCKADDR *)&client, &csize);
                    
                    if (s_client == INVALID_SOCKET)
                        fprintf(stderr, "La fonction accept a echoue.\n");
                    else
                    {
                        char buffer[500];
                        char chaine[500];
                        int n;
                        
                        printf("Le client %s s'est connecte !\n", inet_ntoa(client.sin_addr));
                        
                        strcpy(buffer, "Bonjour\n");
                        send(s_client, buffer, (int)strlen(buffer), 0);
                        
                        n = recv(s_client, buffer, sizeof(buffer) - 1, 0);
                        
                        
                        
                        
                        
                        
                        /*
                        getch(); 
                        */
                        if (n != SOCKET_ERROR)
                        {
                            buffer[n] = '\0';
                            printf("%s", buffer);
                        }
                        
                        closesocket(s_client);
                    }
                }
            }
            
            closesocket(s_server);
        }
        
        WSACleanup();
    }
    
    return 0;
}





j'ai 16 ans et j'aime l'informatique, surtout les programmes
mardi 6 avril 2010 à 15:15:24 | Re : problème chat

louis14


Bonjour,
je pense qu'il faudrait que tu lances le deuxième cient sur un autre PC. Tu Ouvres 2 fois le même sockets sur la même machine (même Adresse IP et port).

louis


Cette discussion est classée dans : server, chaine, client, socket, if


Répondre à ce message

Sujets en rapport avec ce message

client & server [ par Stormy ] J'ai codé un serveur simple usant de TCP. Comme client j'utilise NetCat. Or, quand NetCat 'ferme', mon serveur ne détecte pas la clôture de la relatio Etat Socket Linux [ par cybermax62 ] Existe-t-il un moyen de connaître sur un server (socket,C) l'état d'un connection client (socket,C) utilisant le protocole SOCK_STREAM ? Actuellement Client Server -> le faire fonctioner comme un trojan [ par wxccxw ] Salut, enfaite, j'aimerai faire un client -> serveur, je maitrise pas mal les socket, mais je n'ai pas compris a quoi sa sert : recv(); c pour recevo chat client server [ par electroonn ] Bonjour, j'essaye de developper avec c++ une application de chat (client-server) sous windows, en voici le code:Server server; Client client; void m delay client sur server socket linux [ par 0x0syscall ] Bonjour,Voilà, je voudrais savoir comment je dois m'y prendre pour que sur mon serveur si le client ne repond pas au bout de X secondes, le serveur co plantage du serveur [ par Adict ] Bonjour [^^happy13] alors voila j'ai fini un projet mais il y a un problème. Il se compose d'une application client et serveur. Il y a quelque temps [C.] 2 Problèmes sur le serveur [ par Adict ] bonsoir tout le monde. [^^happy13] alors ça va faire vraiment longtemps que je patine sur mon serveur. J'ai cherché et cherché pour le 2ème problème Problème de Compilation (avec classes) [ par baptchr55 ] Bonjour à tous... Voilà, j'ai un nouveau problème. J'ai une classe (permettant de créer des Sockets TCP) et lorsque j'essaye de créer un objet Socket dns socket server client distants [ par Snyps ] Bonjour, Je galère avec les sockets. J'ai créé un server et un client qui se connectent en local. Pas de soucis. Mais comment faire pour ce qui est socket borlandC++6 [ par faucheuse ] Bonjour a tous Alors voila j'essai d'apprendre a me servir de la socket sous BORLAND C++6, mais ca me met toujours plein d'erreur. Finalement j'arri


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,452 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales