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

Réseau C Discussion :

Echange de fichier vidéo via une socket


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 35
    Par défaut Echange de fichier vidéo via une socket
    Bonjour à tous,
    Alors voilà je me met depuis peu à la programmation réseau pour un projet dans ce but j'ai réalisé deux programme un client et un serveur qui s'échangent des fichier.
    Dans un but évident il faudrait que les fichiers transmis et/ou reçus soit de n'importe quels types or avec un fichier type .txt aucun problème mais quand j' essaye avec un fichier vidéo (.avi par exemple) déjà il ne transfert pas tou le fichier (en moyenne il manque environ 30Mo) et sur la vidéo je ne parvien à lire que les 15 premières secondes sur le fichier transferé.
    j'utilise un flux de type FILE* pour transférer les donnés et j'ai beau chercher je ne trouve que des tuto pour le transfert de simple chaine de charactère Alors si quelqu'un a un tuyau merci beaucoup.

    PS : l'application est sensé tourné sur un noyau unix

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    On peut voir le code de l'ouverture du fichier ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 35
    Par défaut
    Bien sur,
    La construction de l'adresse a contacter est faite dans lecture argument et de ce côter je suis sur de moi.

    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
    int client(int argc , char ** argv){
    int sock , nb_lu;
    FILE *entree;
    struct sockaddr_in adresse;
    char buffer[LG_BUFFER];
    char path[1024];
     
    if(lecture_argument(argc, argv, &adresse , "udp")<0) exit(EXIT_FAILURE);
     
    adresse.sin_family = AF_INET;
     
    if((sock = socket(AF_INET, SOCK_DGRAM ,0))<0){
    perror("erreur socket");
    exit(EXIT_FAILURE);
    }
     
    printf("donner le chemin du fichier\n");
    scanf("%s",path);
     
    if((entree = fopen(path,"r+")) == NULL){
    perror("erreur d'ouverture fichier");
    exit(EXIT_FAILURE);
    }
     
    printf("début de transmission\n");
     
    while((nb_lu = fread(&buffer,sizeof(char),LG_BUFFER,entree)) , !feof(entree)){
     
    if(nb_lu<0){
    perror("erreur de fread");
    break;
    }
     
    //printf("octet transmis : %X\n",buffer);
     
     
    sendto(sock,&buffer,LG_BUFFER,0,
    (struct sockaddr *) &adresse,sizeof(struct sockaddr_in));
    }
    printf("fin de transmission\n");
    fclose(entree);
    close(sock);
     
    return EXIT_SUCCESS;
    }

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Déjà faire un transfert de fichier en UDP est une très mauvaise idée étant donné qu'avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sendto(..., data1, ...);
    sendto(..., data2, ...);
    Il n'est nullement garanti que data1 parviendra à la destination avant data2. Il FAUT utiliser TCP. Mais ce n'était pas là ton problème et j'en doute d'ailleurs qu'elle provient du client. Moi, c'est le code du récepteur qui m'intéresse. Tu as sûrement commis l'erreur classique à savoir penser que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    recv/recvfrom (..., buffer, sizeof(buffer), ...);
    Lit sizeof(buffer) octets. Pourtant, c'est juste une demande de lire AU PLUS sizeof(buffer) octets. Dès que des données sont disponibles, elles seront retournées. Lire la valeur de retour de la fonction pour connaître le nombre d'octets lus.

    Du côté du fichier, il faut ouvrir en mode "rb" dans l'émetteur (pour lire) et en "wb" dans le récepteur (pour écrire).

    Ensuite, tu devrais changer ton fread en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread(buffer, 1, LG_BUFFER, entree);
    En effet, l'ancien code suppose que tout fichier doit être de taille multiple de LG_BUFFER.

    Il faudra également réécrire la boucle parce qu'elle n'est pas très "sécurisée".

    Fais les modifs et poste le code du client ET le code du serveur la prochaine fois que tu repasseras.

  5. #5
    Membre chevronné Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Par défaut
    Citation Envoyé par Melem Voir le message
    Déjà faire un transfert de fichier en UDP est une très mauvaise idée
    Outre le fait que le séquencement n'est pas garanti par le protocole, il faut ajouter aussi que le protocole UDP ne garantit pas la réception des paquets envoyés.

    Il se peut que ton émetteur envoie des paquets, que le écepteur ne les recoive pas et que personne n'en sache rien (d'où peut être tes octets manquants à l'appel).

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Pour ce type de transferts, j'aurai également eu plutôt tendance a utiliser un flux binaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FILE *fd = fopen("mon_fichier","rb");

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

Discussions similaires

  1. Envoi fichier txt via une socket Java
    Par abbesmor dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 30/10/2013, 16h12
  2. Importer un fichier xml via une requete html
    Par peyo6 dans le forum Struts 1
    Réponses: 3
    Dernier message: 20/08/2007, 11h48
  3. Réponses: 2
    Dernier message: 26/07/2007, 09h17
  4. [Tableaux] Envoyer de l'hexa via une socket PHP
    Par N3odyme dans le forum Langage
    Réponses: 2
    Dernier message: 06/05/2006, 19h34

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