begin process at 2012 02 12 17:45:34
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > SERVEUR DE TRANSFERT DE FICHIERS

SERVEUR DE TRANSFERT DE FICHIERS


 Information sur la source

Note :
6,25 / 10 - par 8 personnes
6,25 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseaux & Internet Niveau :Débutant Date de création :11/03/2004 Date de mise à jour :18/03/2004 10:13:15 Vu / téléchargé :10 063 / 874

Auteur : eilyn

Ecrire un message privé
Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

 Description

C'est juste une classe CServeur simple qui permet de tranférer des fichiers du serveur vers le client


Source

  • /* 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();
  • }
/* 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();
}

 Conclusion

En passant j'aimerais savoir comment faire pour transformer ce serveur en serveur FTP.
Merci ^^

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   serveur99

Télécharger le zip


 Sources de la même categorie

Source avec Zip Source avec une capture TRACEROUTE [WINPCAP] par ganjarasta
Source avec Zip SERVEUR MULTITHREAD [LINUX/WIN] par nipepsinicolas
Source avec Zip Source avec une capture SECURE REMOTE SHELL [WIN32] par ganjarasta
Source avec Zip Source avec une capture SUIVI DE PRODUCTION ONDULEUR PHOTOVOLTAÏQUE SOLARMAX par brunovan
Source avec Zip MINICHAT MULTI-CLIENT par wisar

Commentaires et avis

Commentaire de skyghis le 03/07/2004 02:02:22

je T mis 10, ta source est pas mal, mais vo 6 a mon avis
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 :)

Commentaire de keil le 04/10/2004 23:21:34

eh bah, NFS94 ne sait pas configurer son environnement de projet (faut que tu compiles en multi thread sinon ca risque pas de marcher, donc qd tu c pa d'ou vient l'erreur, poz toi la question plutot que faire chier les autres).
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

Commentaire de seto1981 le 09/12/2004 07:30:37

salut,

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

Commentaire de homer242 le 07/05/2005 10:10:31

euh,

bon prog ... à titre d'exemple sur le transfert de fichier, sinon n'amusez vous pas à programmer vos transferts de fichier comme ça :P




Commentaire de MuPuF le 13/04/2007 21:06:14

comme dit homer, faut pas coder comme ça, je poste 1 petite correction au cas où :

#  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

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales