Serveur de transfert de fichiers

Description

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

Source / Exemple :


/* 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 ^^

Codes Sources

A voir également

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.