Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SERVEUR DE TRANSFERT DE FICHIERS


Information sur la source

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é: 8 798 / 842

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   serveur99

Télécharger le zip

Commentaires et avis

signaler à un administrateur
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 :)

signaler à un administrateur
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

signaler à un administrateur
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

signaler à un administrateur
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




signaler à un administrateur
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

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version


HTC G1

Entre 449€ et 449€


Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.