Serveur de transfert de fichiers

Soyez le premier à donner votre avis sur cette source.

Vue 11 393 fois - Téléchargée 939 fois

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

Ajouter un commentaire

Commentaires

MuPuF
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008
-
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
homer242
Messages postés
13
Date d'inscription
mercredi 29 janvier 2003
Statut
Membre
Dernière intervention
30 septembre 2007
-
euh,

bon prog ... à titre d'exemple sur le transfert de fichier, sinon n'amusez vous pas à programmer vos transferts de fichier comme ça :P
seto1981
Messages postés
2
Date d'inscription
jeudi 9 décembre 2004
Statut
Membre
Dernière intervention
9 décembre 2004
-
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
cs_keil
Messages postés
52
Date d'inscription
jeudi 22 mai 2003
Statut
Membre
Dernière intervention
25 octobre 2005
-
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
skyghis
Messages postés
25
Date d'inscription
mardi 13 août 2002
Statut
Membre
Dernière intervention
26 septembre 2004
-
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 :)

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.