|
Trouver une ressource
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
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 ^^
Sources de la même categorie
Commentaires et avis
|
Comparez les prix Nouvelle version

HTC G1
Entre 449€ et 449€
|