IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Transfert de fichiers par sockets


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    Par défaut Transfert de fichiers par sockets
    Bonjour ^^


    Je suis en train d'essayer de créer une application permettant le transfert de fichiers(des images/videos pour etre plus précise), en réseau local pour commencer.
    Je dois faire ce programme en c++, sous VC++ et donc bien sur windows

    Je n'y connais pas grand chose, ni en socket, ni en programmation c++ avancée. Pour le moment je patauge beaucoup, mais j'ai quand meme compris que je dois utiliser les sockets.

    Déjà là, je coince un peu, devrais-je utiliser les classes MFC ? J'essaie actuellement de créer un serveur/client, mais je ne sais pas vraiment marche à suivre est la meilleure...

    De plus, est-ce que je dois utiliser le port 21 pour ce transfert de fichiers ou pas?

    S'il y avait une bonne âme pour éclairer ma lanterne, je lui en serait infiniment reconnaissante ^_^

    Merci d'avance

  2. #2
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 67
    Points : 108
    Points
    108
    Par défaut
    Tu peux utiliser n'importe quel port du moment que les machines qui discutent utilisent le même.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    Par défaut
    Merci, ça me rassure déjà ^^

  4. #4
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 55
    Points : 54
    Points
    54
    Par défaut
    le même... protocole allait il dire (pasque le même port, c'est pas très clair : )

    un protocole c'est comme un langage. Si ton voisin et ta femme parlent japonais, il peuvent communiquer en japonais


    un port c'est comme l'adresse de ta maison, le facteur ne va pas qu'à la maison 21. Mais le courrier qui t'est déstiné va a ta maison et pas celle du voisin

    Le port 21 est utilisé en général par les clients/servers FTP, qui éffectivement échangent des fichiers en utilisant le protocole FTP

    tu peux développer ton propre protocole au dessus de TCP ou UDP ou ce que tu veux

    j'y connais rien en MFC mais je ne pense pas qu'il y ait le moindre socket là dedans

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    Par défaut
    Développer mon propre protocole? Je ne suis meme pas sure de ce que ça veut dire ^^"

    Pour MFC, je ne suis pas sure non plus, mais j'ai des classes CSocket etc, je pensais que ça venait de là.

  6. #6
    Membre régulier
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    81
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 81
    Points : 77
    Points
    77
    Par défaut
    Je te conseille de choper la RFC du protocole FTP sa t'aidra a mieux comprendre comment sa marche...
    Si je ne me trompes pas le protocole utilise deux ports l'un pour l echange de commandes entre le client et le serv et l autre pour les données

  7. #7
    Membre actif Avatar de blackhorus
    Inscrit en
    Février 2003
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 209
    Points : 226
    Points
    226
    Par défaut
    si tu veux apprendre à programmer les sockets et les réseaux en général, bien sûr qu'il te fait lire de tous, un peu de RFC, un peu de socket (un peu... veut dire beaucoup), sinon tu peux toujours utiliser des classes déjà prêtes ... que se soit dans les MFC ou autre bibliothèque

    pour commencer
    client
    serveur

    sinon tu peux toujours regarder ce site il contient peut être ce que tu cherches... 8)

  8. #8
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Est-ce que les fichiers vidéos que tu transfères doivent être visualisés directement ou simplement enregistrés sur le disque dur. Dans le premier cas directX (directShow) te permet ce genre de programmation sans te soucier du protocole utilisé(il suffit juste d'une URL).

    Dans les deux cas ça reste compliqué. Une adresse si tu tiens vraiment à utiliser les MFC.

    http://<br /> http://msdn.microsoft..._mfc.asp<br />

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    Par défaut
    Merci beaucoup, je vais regarder tout ça dès maintenant ^^

    Moldavi : Oui, les videos doivent etre visualisées directement, c'est en quelque sorte un programme de surveillance video, ça dépendra de ce que les clients veulent en faire.


    Je vais déjà essayer de créer mes propres sockets, on verra ce que ça va donner ^^"

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    Par défaut
    Hum bon, j'ai testé les sockets, j'arrive bien à connecter le client au serveur, mais je n'arrive pas à faire de send() et de recv().

    Je n'y connais pas encore rien et je ne comprends pas très bien comment je dois faire pour envoyer qqch du serveur vers le client et vice-versa.

    Je vous donne mon code, il est certainement très pourri mais je débute et je fais des tests peu utiles très souvent ^^"

    Client :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #pragma comment(lib, "ws2_32.lib")
    #include <fstream>
    #include <iostream>
    #include <sstream>
    #include <stdio.h>
    #include <winsock2.h>
     
    using namespace std;
     
    int main()
    {
    	WSADATA WSAData;
    	WSAStartup(MAKEWORD(2,0), &WSAData);
     
    	SOCKET sock;
    	SOCKADDR_IN sin;
    	sin.sin_addr.s_addr	= inet_addr("127.0.0.1"); //cote client
    	sin.sin_family		= AF_INET;
    	sin.sin_port		= htons(4148);
    	sock = socket(AF_INET,SOCK_STREAM,0);
    	bind(sock, (SOCKADDR *)&sin, sizeof(sin));
     
    	connect(sock, (SOCKADDR *)&sin, sizeof(sin));
     
        //thus we declare them here.
        SOCKET server;
        sockaddr_in from;
        int fromlen=sizeof(from);
        char *temp = new char[512];
    	char buff[512];
     
        if(listen(server,10)!=0)
        {
            cout << "Erreur d'ecoute" << endl;
    		return 0;
        }
     
    	temp = "Connection du client";
        send(sock,temp,strlen(temp),0); 
    	int y;
        ofstream fichier( "c:\\reception\\recv.txt" );
    	if (!fichier) 
    	{   cerr << "Impossible d'ouvrir le fichier!" << endl;  }
     
     
     
    	/* Fermeture du fichier */
     
    		fichier << buff << " y = ";
    		fichier << y;
    		fichier << endl;
     
    	fichier.close();
     
    	system("PAUSE");
     
    	return 0;   
    }

    Serveur :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    #pragma comment(lib, "ws2_32.lib")
    #include <winsock2.h>
    #include <iostream> 
    #include <fstream>
    #include <sstream>
    #include <stdio.h>
     
    using namespace std;
     
    int main()
    {
     
        cout << "Starting up TCP server\r\n";
     
     
        SOCKET server;
        WSADATA wsaData;
        sockaddr_in local;
     
        int wsaret=WSAStartup(0x101,&wsaData);
     
        if(wsaret!=0)
        {
            return 0;
        }
     
        //Now we populate the sockaddr_in structure
        local.sin_family=AF_INET; //Address family
        local.sin_addr.s_addr=INADDR_ANY; //Wild card IP address
        local.sin_port=htons((u_short)4148); //port to use
     
        //the socket function creates our SOCKET
        server=socket(AF_INET,SOCK_STREAM,0);
     
        //If the socket() function fails we exit
        if(server==INVALID_SOCKET)
        {
            return 0;
        }
     
        if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
        {
            return 0;
        }
     
        //listen instructs the socket to listen for incoming 
        //connections from clients. The second arg is the backlog
        if(listen(server,10)!=0)
        {
            return 0;
        }
     
        //we will need variables to hold the client socket.
        //thus we declare them here.
        SOCKET client;
        sockaddr_in from;
        int fromlen=sizeof(from);
     
        while(true)//we are looping endlessly
        {
            char temp[512];
    //		char buff[512];
            //accept() will accept an incoming
            //client connection
            client=accept(server,(struct sockaddr*)&from,&fromlen);
     
     
     
            sprintf(temp,"Your IP is %s\r\n\r\n",inet_ntoa(from.sin_addr));
     
            //we simply send this string to the client
            send(client,temp,strlen(temp),0);	
     
    		sprintf(temp," %s is your IP\r\n\r\n",inet_ntoa(from.sin_addr));
            send(client,temp,strlen(temp),0);
     
     
            cout << "Connection from " << inet_ntoa(from.sin_addr) <<"\r\n";
            //close the client socket
            closesocket(client);
     
     
        }
     
        //closesocket() closes the socket and releases the socket descriptor
        closesocket(server);
     
        //originally this function probably had some use
        //currently this is just for backward compatibility
        //but it is safer to call it as I still believe some
        //implementations use this to terminate use of WS2_32.DLL 
        WSACleanup();
     
        return 0;
    }

    Evidement les commentaires ne sont pas de moi, je récupère des bouts de code à droite et à gauche pour apprendre à m'en servir.

    Dans mon fichier, il m'envoit :

    ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ [...] ÌÌÌÌÌÌÌÌÌÌÌ|PG y = -858993460

    Merci d'avance ^^

  11. #11
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Normalement ça risque d'être difficile pour toi si déjà tu as du mal à programmer des sockets. En effet tu veux faire du streaming en direct et visualiser les vidéos. Je te conseille directX en dernier recours. C'est pas simple, mais si tu n'as pas le choix.

    DirectShow a des chances d'être beaucoup plus optimisé pour gérer du streaming en direct.

    A toi de voir. Une question. Comment récupères-tu le flux vidéo que tu veux transférer sur le réseau?

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    Par défaut
    Mon maitre de stage m'a dit que le driver n'était pas concu pour du directX.
    En fait, il a créé un driver qui récupère les images vidéos qui se trouvent sur une carte d'acquisition, moi je dois faire une sorte de "librairie" pour ce programme.

  13. #13
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    tout ça paraît un peu flou... Tu parles de streaming, de sockets, de bibliothèques...
    Est-ce que tu sais concrètement ce que tu dois faire ? quel est le but ? pourquoi utiliser les sockets et pas DirectX ou DirectShow ?
    est-ce que tu as fait une conception (même minimaliste) avant de foncer dans le code ?

  14. #14
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Une fois que la solution classique marchera (voir code de Kaori), sous Windows tu peux utiliser TransmitFile qui est une fonction Win32 optimisée pour le transfert de fichiers.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    Par défaut
    Tut : Je dois transférer des images/videos d'un ordinateur à un autre. Je ne sais pas réellement ce que je dois utiliser, je suis arrivée au socket en me renseignant sur internet. Et euh je ne pense pas avoir fait de conception non ^^" Et comme je le dis plus haut, directShow ne s'accorde pas avec le driver original de la carte d'acquisition video apparement.

    Aurelien : Grace à un autre code, j'ai réussi les send et les recv, je vais donc me pencher sur transmitFile puisque maintenant j'ai besoin de réussir à transférer des fichiers ^^

    Encore merci à tous pour votre aide, je me sens souvent un peu perdue à ne pas savoir quoi faire ^^"

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    Par défaut
    J'ai réussi à transférer mes images par socket sans utiliser Transmitfile, mais je dois encore paufiner le code qui est un peu pourri en ce moment ^^"

    Si ça interesse qq'un, je le posterai après ici.

  17. #17
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Ce qui m'intéresserai, c'est que tu compares le temps mis entre la version de base et l'utilisation de TransmitFile (sur un gros fichier), ainsi que la charge CPU.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    Par défaut
    Erf voui, je veux bien mais en fait c'est pcq je ne comprends pas comment utiliser le TransmitFile ^^"

    Et pour le moment c'est loin d'etre parfait, je boucle indéfiniment pcq je n'arrive pas à envoyer la taille du fichier (voui voui, je suis hyper nulle en socket >.>)

  19. #19
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Tu peux envoyer un en-tête qui contient le nom du fichier, sa taille, etc... Puis envoyer le fichier en suivant, ou créer une 2° socket temporaire dédiée au transfert de ce fichier (comme ftp : une socket pour les commandes, une autre pour les transferts).

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TransmitFile(sock,hFile,size,1024,NULL,NULL,TF_REUSE_SOCKET);
    J'ai une erreur en compilation à propos du transmit_file_buffer :

    e:\program files\microsoft visual studio\vc98\include\mswsock.h(75) : error C2011: '_TRANSMIT_FILE_BUFFERS' : 'struct' type redefinition


    Et je ne comprends pas comment je dois appeller la fonction en fait, je ne trouve pas d'exemple pour comprendre comme ça fonctionne.


    Edit : l'erreur n'apparait plus quand je retire l'include Mswsock.h, je pensais que je devais le mettre, mais je ne comprends tjrs pas comment cette fonction s'utilise...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Transfert de fichier par socket client vers client
    Par Dasson dans le forum Entrée/Sortie
    Réponses: 21
    Dernier message: 17/04/2012, 02h26
  2. Transfert fichier par socket
    Par allserv dans le forum Réseau
    Réponses: 1
    Dernier message: 21/10/2008, 16h30
  3. Transfert de fichiers par socket
    Par hebus44 dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 27/10/2007, 13h55
  4. Réponses: 17
    Dernier message: 15/05/2007, 18h35
  5. Transfert de fichier par ftp
    Par schub1015 dans le forum MFC
    Réponses: 3
    Dernier message: 14/01/2004, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo