Soyez le premier à donner votre avis sur cette source.
Vue 11 615 fois - Téléchargée 962 fois
/* Serveur de transfert de fichier écrit par l'elfe ténébreux */ /* ici c'est le serveur.h */ /* avec la définition des méthode de la classe CServeur */ /* développé sous visual .NET */ #pragma once #ifndef _CSERVEUR_H #define _CSERVEUR_H #include <stdio.h> #include <winsock2.h> #include <iostream> #include <windows.h> using namespace std; class CServeur { public: SOCKET s; unsigned short port; CServeur(unsigned short _port); //constructeur paramétré CServeur(); //constructeur par défaut ~CServeur(); //destructeur bool run(); //connection du client void echanges(); //transfert de données }; #endif /* et la le fichier serveur.cpp */ /* j'explique pas plus c'est détaillé dedans ^^ */ #include "serveur.h" #define TAILLE_BUF 1000 DWORD WINAPI MultiConnection(LPVOID sock); CServeur::CServeur(unsigned short _port) { port= _port; } CServeur::CServeur() {} CServeur::~CServeur() { closesocket(s); } bool CServeur::run() { WORD wVersionRequested; WSADATA wsaData; HOSTENT* pHost; SOCKADDR_IN sin, gin; int ginlen= sizeof(SOCKADDR); wVersionRequested= MAKEWORD (2, 0); if (WSAStartup (wVersionRequested, &wsaData)!= 0) { cout<<"Initialisation Couche réseau impossible"<<endl; exit (2); } /* Teste de la version supportée. */ if (LOBYTE (wsaData.wVersion)!= 2 || HIBYTE (wsaData.wVersion) != 0) { cout<<"Pas de Couche réseau en version 2.0"<<endl; exit (3); } /* Création de la socket */ s= socket (AF_INET, SOCK_STREAM, 0); if (s== INVALID_SOCKET) { cout<<"Création de la socket impossible"<<endl; exit (5); } /* Mise à jour structure sockaddr_in */ memset (&sin, 0, sizeof (SOCKADDR_IN)); sin.sin_family= AF_INET; sin.sin_port= htons (21); /* On nomme la socket */ if (bind (s, (SOCKADDR*) &sin, sizeof (SOCKADDR_IN))== SOCKET_ERROR) { cout<<"Impossible de nommer la socket"<<endl; closesocket (s); exit (6); } /* Ecoute en attente d'un connexion du client */ listen (s, 4); cout<<"En attente d'une connexion"<<endl; echanges(); } void CServeur::echanges() { SOCKET g; SOCKADDR_IN sin, gin; int ginlen= sizeof (SOCKADDR); while(1) { /* Tentative d'acceptation de la connexion */ if ((g= accept (s, (SOCKADDR*) &gin, &ginlen))== INVALID_SOCKET) { cout<<"Connection impossible"<<endl; closesocket (s); } cout<<"Connexion serveur OK"<<endl; unsigned char ad1=gin.sin_addr.S_un.S_un_b.s_b1; // unsigned char ad2=gin.sin_addr.S_un.S_un_b.s_b2; //adresse IP unsigned char ad3=gin.sin_addr.S_un.S_un_b.s_b3; //du client unsigned char ad4=gin.sin_addr.S_un.S_un_b.s_b4; // cout<<"adresse du client: "<<(int)ad1<<"."<<(int)ad2<<"."<<(int)ad3<<"."<<(int)ad4<<endl; CreateThread(NULL,0,MultiConnection,(LPVOID)g,0,NULL); //creation du thread } closesocket(s); WSACleanup(); } DWORD WINAPI MultiConnection(LPVOID sock) { SOCKET g=(SOCKET) sock; int taille; int temp=0; char transfert[TAILLE_BUF]; FILE* fichier; /* Réalisation des échanges en mode connecté */ fichier=fopen("dam.txt","r+b"); if(fichier == NULL) { cout << "erreur d'ouverture du fichier" << endl; exit(1); } fseek( fichier, 0, SEEK_END ); //on se place a la fin du fichier taille=ftell(fichier); //on récupere la position donc la taille fseek( fichier, 0, SEEK_SET ); //on se replace au début du fichier cout << "taille du fichier: "<<taille<<" octets"<<endl; temp=taille; taille=ntohl(taille); send(g,(char *)&taille,sizeof(taille),0); //on envoie la taille du fichier while(temp>TAILLE_BUF) //si la taille du fichier est supérieure à la taille du buffer { fread(transfert,1, TAILLE_BUF, fichier); //on lit le contenu du fichier send(g, transfert, TAILLE_BUF, 0); //et on l'envoie temp=temp-TAILLE_BUF; //tant qu'on n'est pas à la fin du fichier } fread(transfert,1, TAILLE_BUF, fichier); //on lit le contenu du fichier send(g, transfert, temp, 0); //et on l'envoie fclose (fichier); closesocket (g); cout<<"transfert termine"<<endl; } void main() { CServeur serveur; serveur.run(); }
13 avril 2007 à 21:06
# fread(transfert,1, TAILLE_BUF, fichier); //on lit le contenu du fichier
# send(g, transfert, TAILLE_BUF, 0); //et on l'envoie
deviens :
# int size;
# size=fread(transfert,1, TAILLE_BUF, fichier); //on lit le contenu du fichier, size récupere la taille effectivement lue (et oui, tout les fichiers n'ont pas une taille modulo TAILLE_BUF ;-)
# send(g, transfert, size, 0); //et on l'envoie
7 mai 2005 à 10:10
bon prog ... à titre d'exemple sur le transfert de fichier, sinon n'amusez vous pas à programmer vos transferts de fichier comme ça :P
9 déc. 2004 à 07:30
juste pour savoir si qqn aurait des sources pour faire un client serveur tout simple avec le transfert des fichiers bidirectionnel.
merci d'avance pour votre aide
4 oct. 2004 à 23:21
Sinon pour l'auteur de ce prog, bah, je dirai que c'est presque correct, mais c'est pas encore ca!
je pense que tu a placé ton appel de thead un peu trop loin, c'est avant qu'il faut paralléliser pour que ton prog march parfaitement.
sinon ca reste un bon prog
3 juil. 2004 à 02:02
G mis 10 pour remonter ta note car il y a franchement des abrutis, hein NSF94
T vraiment trop 1 boulay toi, apprend a coder, & tu aurais p-e compris comment ca marche ;)
c'est rar que je mette des commentaires, mais la je trouve la reaction de NSF94 trop habuser, on devais mettre des blam pour des reply pareil, & O bout de X blam, kick du compte & de l'IP pour X temps :)
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.