Aide serveur de discussion
matthieuf
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
-
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
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
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:
- Aide serveur de discussion
- Recuperer discussion whatsapp - Guide
- Changer serveur dns - Guide
- Discussion vocale whatsapp - Accueil - Messagerie instantanée
- Serveur de reception mail - Guide
- Chat discussion instantanée - Accueil - Réseaux sociaux
1 réponse
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.
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.