Aide serveur de discussion

Fermé
matthieuf Messages postés 2 Date d'inscription dimanche 28 octobre 2012 Statut Membre Dernière intervention 24 novembre 2012 - 24 nov. 2012 à 15:03
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 26 nov. 2012 à 11:42
Bonsoir,

Je cherche à réaliser un serveur de discussion instantané multi client en C sous visual studio.
Lorsque je lance mon programme serveur, un message d'erreur s'affiche indiquant "Exception non gérée à 0x77ea15de dans Serveur.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033c004."

Pour l'instant j'essaye juste de connecter les clients au serveur, et j'affiche leur socket pour voir s'il sont bien connectés; j'ai donc bloqué les fonctions émissions et réceptions.

J'aimerai avoir votre avis sur le code et que vous m'indiquiez les erreurs que j'ai commises.
merci

	

#include "stdafx.h"
#include <winsock2.h>
typedef int socklen_t;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PORT 23
#define LongMax 200
#define ClientMax 4

#include <pthread.h>

int erreur ;
int n°client ;
int i = 0 ;
SOCKET sock ;
void* sk = &sock ;
SOCKADDR_IN sin ;
SOCKET csock ;
SOCKADDR_IN csin ;
char bufferE[4096] ;
char bufferR[4096] ;
int sock_err ;
socklen_t recsize = sizeof(csin) ;
pthread_t thread_accept ;

FILE* logo = NULL;
char ligne[LongMax];

struct client {
	char pseudo[50];
	SOCKET csock;
	SOCKADDR_IN csin ;
	pthread_t thread_client;
	bool utilisation ; /*0= slot disponible, 1= slot indisponible*/
};

struct client liste_client[ClientMax];


void lecture_Text(void)
{
	logo = fopen("logo_Serveur.txt", "r") ;
	if (logo != NULL)
	{
		while (fgets(ligne, LongMax, logo) != NULL)
		{
			printf("%s\r", ligne) ;
		}
		fclose(logo);
	}
	else (printf("erreur \n")) ;
	printf("\n") ;
}

void emission(void)
{
	do 
	{	
		gets(bufferE);
	    sock_err = send(liste_client[i].csock, bufferE, 4096, 0);
		if(sock_err != SOCKET_ERROR)
			printf("%s\n", bufferE);	
		else 
		{
			printf("Erreur de transmission\n") ;
			liste_client[i].utilisation = 1 ;
		}
	}
	while (strcmp(bufferE, "/quit") != 0);
}

void* reception(void* sk)
{
	do {
		if(recv(csock, bufferR, 4096, 0) != SOCKET_ERROR)
			printf("Recu : %s\n", bufferR);
		else printf("Erreur dans la reception\n");
			
	}
	while (strcmp(bufferE, "/quit") != 0);
return NULL;
}

void initialisation(void)
{
	system("color 0F") ;
	lecture_Text();
	printf("                Bienvenue dans le chat Felix version 3.0 \n");
	printf("                     Veuillez taper sur une touche \n");
	getchar();
	system("cls");

	WSADATA WSAData;
	erreur = WSAStartup(MAKEWORD(2,2), &WSAData);

	for (n°client = 0; n°client <= ClientMax; n°client++)
	{
		liste_client[n°client].utilisation = 0;
	}
}

int slot_libre(void)
{
	n°client = 0 ;
	while (liste_client[n°client].utilisation = 1)
	{
		n°client++;
	}
	return n°client;
}

void* scan(void*)
{
	 liste_client[slot_libre()].csock = accept(sock, (SOCKADDR*)&csin, &recsize);
	 if (liste_client[slot_libre()].csock != INVALID_SOCKET)
	 {	 
		 liste_client[slot_libre()].utilisation = 1;
		 printf("%d", liste_client[slot_libre()].csock);
	 }
	 else
	 {
		 printf("Erreur dans l'acceptation");
	 }
return NULL;
}



int main(void)
{
	initialisation();
	sock = socket(AF_INET, SOCK_STREAM, 0);
 
    if(sock != INVALID_SOCKET)
    {
		printf("La socket %d est maintenant ouverte en mode TCP/IP\n", sock);
 
        sin.sin_addr.s_addr    = htonl(INADDR_ANY);
        sin.sin_family         = AF_INET;
        sin.sin_port           = htons(PORT);         
        sock_err = bind(sock, (SOCKADDR*)&sin, sizeof(sin));
		
		if(sock_err != SOCKET_ERROR)
        {
			sock_err = listen(sock, 5);
            printf("Mise en ecoute de la socket sur le port %d...\n", PORT);
			if(sock_err != SOCKET_ERROR)
			{
             printf("Patientez pendant que les clients se connectent sur le port %d...\n", PORT);
			 
			 pthread_create(&thread_accept, NULL, scan, NULL);
			 getchar();

			 		 			

			/*pthread_create(&liste_client[0].thread_client, NULL, reception, sk); parametre= socket serveur
			emission(); /*parametre= socket client*/
			 
			/*if (pthread_cancel(liste_client[0]thread_client)== 0)
			{
				printf("Conversation terminée") ;
			}
			else printf("Erreur du thread") ;*/
			 
			shutdown(sock, 2);
			}
		}
	
		printf("Fermeture de la socket...\n");
		closesocket(sock);
		printf("Fermeture du serveur terminee\n");
	}
	
	WSACleanup();
	getchar();
	
	return EXIT_SUCCESS;
}




A voir également:

1 réponse

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
26 nov. 2012 à 11:42
Salut.
Ton code semble pas mal, mais il est assez difficile à lire pour trouver ton erreur.
essai de voir dans quel partie ça plante, ajoute des affichages d'erreur si tu n'y arrives pas. L'idéal dans ces cas là, c'est d'utiliser le debugueur qui te dit exactement où l'erreur se produit et te permet d'examiner les variables.
0