You are on page 1of 5

Bonjour. Je cherche a crer un programme capable de transmettre un fichier par le rseaux.

Pour cela j'utilise les socket, je vous prvient je suis dbutant en la matire ! Voici les sources du programme qui envoie le fichier :
Code C/C++ :

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock2.h> typedef int socklen_t; #define PORT 6666 #define MAXIMUM 50 #define T_LIGNE 100 int main() { WSADATA WSAData; int erreur = WSAStartup(MAKEWORD(2,2), &WSAData); SOCKET sock; SOCKADDR_IN sin; SOCKET csock; SOCKADDR_IN csin; socklen_t recsize = sizeof(csin); int sock_err; int i, a; char ligne[T_LIGNE] = {'\0'}; int tailleFichier = 0; char PATH[MAXIMUM] = {'\0'}, extension[MAXIMUM] = {'\0'}; FILE * fichier = NULL; printf("Bienvenu dans le telechageur de fichier | version ALPHA\n\n"); printf("Chemin du fichier a envoye : "); scanf("%s", PATH); for(i = 0, a = 0; PATH[i] != '\0'; i++) { if(PATH[i] == '.') { while(PATH[i+1] != '\0') { i++; extension[a] = PATH[i]; a++; } } } if(strcmp("rar", extension) != 0 && strcmp("zip", extension) != 0 && strcmp("exe", extension) != 0 && strcmp("txt", extension))

{ printf("\nL'extension choisie n'est pas accepte par le telechageur de fichier !\nVeuillez a ce qu'elle soit un .rar, un .zip, un .exe ou un .txt !\n\n"); goto stop; } else if((fichier = fopen(PATH, "rb")) == NULL) { printf("\nImpossible d'ouvrir : %s\n\n", PATH); return EXIT_FAILURE; } fseek(fichier, 0, SEEK_END); tailleFichier = ftell(fichier); printf("\nTaille du fichier = l'envoie du fichier en entrant (float)tailleFichier/1000); scanf("%d", &a); if(a != 1) goto stop; if(!erreur) { sock = socket(AF_INET, SOCK_STREAM, 0); /* Si la socket est valide */ if(sock != INVALID_SOCKET) { printf("\n\nLa socket %d TCP/IP\n", sock); %d octets soit %.3f ko\n Confirmer 1 sinon 2 = ", tailleFichier,

est

maintenant

ouverte

en

mode

/* Configuration */ sin.sin_addr.s_addr = htonl(INADDR_ANY); /* Adresse IP automatique */ sin.sin_family = AF_INET; /* Protocole familial (IP) */ sin.sin_port = htons(PORT); /* Listage du port */ sock_err = bind(sock, (SOCKADDR*)&sin, sizeof(sin)); /* Si la socket fonctionne */ if(sock_err != SOCKET_ERROR) { /* Dmarrage du listage (mode server) */ sock_err = listen(sock, 5); printf("Listage du port %d...\n", PORT); /* Si la socket fonctionne */ if(sock_err != SOCKET_ERROR) { /* Attente pendant laquelle le client se connecte */ printf("Recherche d'une connexion sur le port %d...\n", PORT); csock = accept(sock, (SOCKADDR*)&csin, &recsize); printf("Connexion entrante avec la socket %d %s:%d\n\n", csock, inet_ntoa(csin.sin_addr), htons(csin.sin_port)); de

sock_err = send(csock, extension, 50, 0); for(i = 0; i != tailleFichier; i++) { fgets(ligne, 100, fichier); sock_err = send(csock, ligne, 100, 0); if(sock_err == SOCKET_ERROR) { printf("Erreur de transmission\n"); goto stop; } } if(sock_err != SOCKET_ERROR) printf("fichier %s envoyer !\n", PATH); } } } } stop : if(fichier != NULL) fclose(fichier); shutdown(csock, 2); printf("Fermeture de la socket\n"); closesocket(sock); printf("Fermeture du serveur terminee !\n"); WSACleanup(); return EXIT_SUCCESS; }

Voici les sources du programme qui recois le fichier :


Code C/C++ :

#include <stdio.h> #include <stdlib.h> #include <winsock2.h> typedef int socklen_t; #define PORT 6666 int main() { WSADATA WSAData; int erreur = WSAStartup(MAKEWORD(2,2), &WSAData); SOCKET sock; SOCKADDR_IN sin; char IP[50] = {'\0'}, extention[50] = {'\0'}, PATH[50] = {'\0'}; char ligne[100] = {'\0'}, uneFois = 0, valide = 0;

FILE * fichier = NULL; printf("Bienvenu dans le telechageur ALPHA\n\nChoisissez l'IP pour se connecter : "); scanf("%s", IP); /* Si les sockets Windows fonctionnent */ if(!erreur) { /* Cration de la socket */ sock = socket(AF_INET, SOCK_STREAM, 0); /* Configuration de la connexion */ sin.sin_addr.s_addr = inet_addr("127.0.0.1"); sin.sin_family = AF_INET; sin.sin_port = htons(PORT); /* Si l'on a russi se connecter */ do { if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR) { valide = 1; printf("Connection %s sur le port %d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port)); if(uneFois == 0 && (recv(sock, extention, 50, SOCKET_ERROR)) { uneFois = 1; sprintf(PATH, "nouveau_fichier.%s", extention); fichier = fopen(PATH, "wb"); } 0) != recepteur | Version

while(recv(sock, ligne, 100, 0) != SOCKET_ERROR) { printf("%d", recv(sock, ligne, 100, 0) != SOCKET_ERROR); printf("Donnee recu...\n\n"); fprintf(fichier, "%s", ligne); } } /* sinon, on affiche "Impossible de se connecter" */ else { valide = 0; printf("\n\nRecherche d'un hote...\n"); Sleep(1000); } }while(valide == 0); /* On ferme la socket */ } WSACleanup(); fclose(fichier); return EXIT_SUCCESS; }

Mon programme "serveur" marche plutt bien, enfin je pense. Par contre pour ce qui est du programme "client" il ne fonctionne pas tres bien ! J'ai une infinit de "Donnee recu..." ! Je ne sais pas comment faire en sorte que l'envoie de donn s&#8217;arrte une fois qu'il n'a plus rien a envoyer ! En vous remerciant d'avance...

You might also like