Problème chat

cs_Adict Messages postés 28 Date d'inscription vendredi 1 janvier 2010 Statut Membre Dernière intervention 10 août 2010 - 4 avril 2010 à 18:42
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 - 6 avril 2010 à 15:15
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
#include
#include
#include
#include
#include
#include

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
#include
#include
#include
#include
#include
#include

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

1 réponse

cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
6 avril 2010 à 15:15
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
0
Rejoignez-nous