thechief | Bonjour,
Je ne souhaite pas concurence msn messenger et les autres mais juste apprendre le langage C.
J'ai déjà programmé quelques programmes simpliste et là je m'attaque aux sockets avec cette appli dont voici le code source
Serveur :
Code :
- /* Simple chat v 1.0 */
- /* by thechief */
- /* SERVER */
- #include <stdio.h>
- #include <winsock2.h>
- #include <string.h>
-
- main(void)
- {
- printf("Simple Chat server v 1.0\n" );
- printf("see www.kilhwch.info for questions \n\n" );
-
- WSADATA WSAData; // Initialisation des variables
- int start_wsa;
-
- int serveur_socket, client_socket;
- struct sockaddr_in ip_serveur, ip_client;
- int port = 1000;
- int ip_serveur_size;
-
- int envoyer, recevoir;
- char buffer_send[512];
- char buffer_recv[512];
-
-
- if((start_wsa = WSAStartup(MAKEWORD(2,0), &WSAData)) != 0) { // Initialisation de la dll Winsock
- printf("Erreur : Initialisation de winsock impossible \n" );
- return 0; // Si erreur fin d'éxécution du programme
- }
-
- memset(&ip_serveur, 0, sizeof(ip_serveur)); // Met la structure à zéro
-
- ip_serveur.sin_family = AF_INET; // socket family
- ip_serveur.sin_addr.s_addr = htonl(INADDR_ANY); //Adresse IP (any = server)
- ip_serveur.sin_port = htons(port); //Port
-
-
- if((serveur_socket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET){ // Création de la socket
- printf("Erreur : Creation de la socket impossible \n" );
- return 0; // Si erreur fin d'éxécution du programme
- }
-
-
- bind(serveur_socket, (struct sockaddr *)&ip_serveur, sizeof(ip_serveur)); // On lie le socket
-
- listen(serveur_socket, 0); // Ecoute sur le port voulu
-
- ip_serveur_size = sizeof(ip_client);
-
- if((client_socket = accept(serveur_socket,
- (struct sockaddr *)&ip_client,
- &ip_serveur_size)) == -1) { // Connexion avec le client
- printf("Erreur : Connexion avec le client impossible\n" );
- return 0;
- }
-
- printf("Connecte a l'hote\n" );
- printf("Tapez votre message\n\n" );
-
- int c;
- while ((c = getchar()) != '\n' && c != EOF); /* purge du tampon */
-
- while(serveur_socket != INVALID_SOCKET)
- {
-
- fgets(buffer_send, sizeof(buffer_send), stdin);
-
- if ((envoyer = send(client_socket, buffer_send, strlen(buffer_send), 0)) != strlen(buffer_send)){ // Envoyer les données
- printf("Erreur : Envois des donnees impossible\n" );
- return 0;
- }
-
- if(( recevoir = recv(client_socket, buffer_recv,512,0)) != SOCKET_ERROR) // Reception des données
- {
- printf("%s\n", buffer_recv);
- }
-
-
- }
-
- shutdown(client_socket, 2);
- shutdown(serveur_socket, 2);
- close(serveur_socket, 2);
- WSACleanup();
- return 0;
- }
|
et le client :
Code :
- /* Simple chat v 1.0 */
- /* by thechief */
- /* CLIENT */
- #include <winsock2.h>
- #include <stdio.h>
- #include <string.h>
- main(void) {
-
- printf("Simple Chat client v 1.0\n" );
- printf("see www.kilhwch.info for questions \n\n" );
-
- WSADATA WSAData; //initiation des variables
- int start_wsa;
-
- int socket_c;
- struct sockaddr_in adresse;
- int port = 1000; // Port de connexion
- char buffer_ip[16]; // Buffer adresse ip
-
- int envoyer, recevoir;
- char buffer_send[512]; // Buffer d'envoi
- char buffer_recv[512]; // Buffer de reception
-
-
- if((start_wsa = WSAStartup(MAKEWORD(2,0), &WSAData)) != 0) { // Initialisation de la dll Winsock
- printf("Erreur : Initialisation de winsock impossible \n" );
- return 0; // Si erreur fin d'éxécution du programme
- }
-
- if((socket_c = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET){ // Création de la socket
- printf("Erreur : Création de la socket impossible \n" );
- return 0; // Si erreur fin d'éxécution du programme
- }
-
-
- printf("Entrez l'adresse du serveur, exemple : XXX.XXX.XXX.XXX\n\n" ); // Entrez l'adresse du serveur
- scanf("%s", buffer_ip);
- printf("Connexion ...\n\n" );
-
- adresse.sin_addr.s_addr = inet_addr(buffer_ip);
- adresse.sin_family = AF_INET;
- adresse.sin_port = htons(port);
-
- if((socket_c = connect(socket_c,(struct sockaddr *)&adresse, sizeof(adresse))) == -1) { // Connexion avec le serveur
- printf("Erreur : Connexion avec le serveur impossible\n" );
- return 0;
- }
-
- printf("Connecte au serveur\n" );
- printf("En attente d'un message\n\n" );
-
- int c;
- while ((c = getchar()) != '\n' && c != EOF); /* purge du tampon */
-
- while(socket_c != INVALID_SOCKET)
- {
-
-
- if((recevoir = recv(socket_c, buffer_recv,512,0)) != SOCKET_ERROR) // Reception des données
- {
- printf("%s\n", buffer_recv);
- }
-
- fgets(buffer_send, sizeof(buffer_send), stdin);
-
- if ((envoyer = send(socket_c, buffer_send, strlen(buffer_send), 0)) != strlen(buffer_send)) // Envoyer les données
- {
- printf("Erreur : Envois des donnees impossible\n" );
- return 0;
- }
-
- }
-
- shutdown(socket_c, 2);
- close(socket_c, 2);
- WSACleanup();
- return 0;
-
-
- }
|
Je lance donc le serveur, puis le client, je tape l'adresse locale ... et là "erreur envois des données impossible et fin d'éxécution du programme cote client !
J'ai retourné la chose dans presque tout les sens mais je n'y arrive pas !
Si un programmeur chevronné passe par là ça serait sympa de me sortir de la galère merci
@++ Message édité par thechief le 03-05-2006 à 21:42:34
|