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 ^^
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.