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 :

[R�seau] [socket] create + bind + file descriptor


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    49
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Par d�faut [R�seau] [socket] create + bind + file descriptor
    Bonjour � tous,

    Voil�, sous linux je dispose d'une programme permettant de lire en temps r�el des fichier .ts (transport stream) sur une sortie vid�o. Pour l'instant mon programme ne lit que des fichiers sur le disque.
    Je souhaiterais qu'il puisse lire les donnees non pas depuis un fichier .ts mais a partir d'un port sur l'ordinateur (les donnees sont envoyees par le r�seau). Pour cela j'utilise un socket, et j'ai quelques soucis avec...

    Mon probl�me est que la fonction "bind" de mon socket renvoit -1, signifiant que le bind n'a pas fonctionn� correctement.

    Voici le code de la fonction responsable de la creation (+bind) de la socket :

    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
     
    int createSocketTSReader ( void ) {
    	printf ( "creation du socket \n\r" ) ;
     
    	// creation d'un socket
        int sock = socket(PF_INET, SOCK_DGRAM, 0);
        if (sock < 0) {
        	printf ( "Erreur a la creation du socket %d... \n\r", sock ) ;
        	return -1 ;
        }
     
    	// informations sur l'hote distant
        struct sockaddr_in dest = { AF_INET } ; 
       // memset ( &dest, 0, sizeof ( struct sockaddr_in ) ) ;
       // dest.sin_family = AF_INET ;
       // dest.sin_addr.s_addr	= inet_addr ( "127.0.0.1" ) ;
        dest.sin_port = htons ( 1234 ) ;
     
        // association de l'adresse de l'hote avec le socket nouvellement cree
        int res = bind(sock, (struct sockaddr *)&dest, sizeof dest);
        if (res != 0) {
        	printf ( " Erreur au 'bind' du socket %d... \n\r", res ) ;
        	return -2 ;
        }
    	printf ( "Socket cree et correctement associe a l'hote distant \n\r" ) ;
     
    	// reception des donnees en provenances du socket
    	char buf[1500];
    	printf ( "reception des donnees du socket \n\r " ) ;
    	recv(sock, buf, sizeof buf, 0);
     
    	printf ( "fin du socket \n\r" ) ;
    	return sock ;
    }
    J'ai d�j� regard� les tutos sur les sockets, mais je ne suis pas un pro et c'est la premi�re fois que j'en impl�mente. Si quelqu'un a une id�e ...

    Egalement, je voudrais savoir comment peut-on consid�rer le descripteur de fichier renvoy� lors de la cr�ation du socket (par la fonction "socket") ? En fait mon code lit des fichiers vid�os .ts a partir d'un argument lors de son appel (ouverture avec la fonction fopen), pourrait-il lire les donnees a partir du descripteur de fichier renvoy� par ce socket ? (avec la fonction fdopen par exemple) ?

    Merci � tous pour votre aide
    D.R.

  2. #2
    Membre �m�rite Avatar de valefor
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    711
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 711
    Par d�faut
    Utilise strerror(errno) pour obtenir une chaine d�crivant ton probl�me (juste apr�s ton if(res != 0)).
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    if(res != 0)
    {
    printf("bind : %d (%d [%s])\n", res, errno, strerror(errno));
    }
    Avec un bon message d'erreur tu pourras peut-�tre commencer � te d�patouiller.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    49
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Par d�faut
    Merci pour ta r�ponse rapide !

    Citation Envoy� par valefor
    Utilise strerror(errno) pour obtenir une chaine d�crivant ton probl�me
    J'ai regard� la signification du dernier message d'erreur grace � ce printf, et il marquait que l'adresse �tait d�j� utilis�e. j'ai rajout� pr�cisement l'adresse IP de mon ordinateur et le bind fonctionne parfaitement

    Merci bien � toi valefor !

    Ma question sur le descripteur de fichier renvoy� par la fonction socket () est toujours ouverte

    edit : en rajoutant close ( sock ) � la fin de mon programme, lorsque je le relance je ne parviens pas � le binder � nouveau (l'adresse est d�j� utilis�e d'apr�s le message d'erreur). Comment faut-il faire pour que le bind fonctionne sur la m�me adresse � chaque appel du programme ?

  4. #4
    Membre �m�rite Avatar de valefor
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    711
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 711
    Par d�faut
    Le file descriptor que tu as r�cup�r� est utilisable par read et write de la m�me mani�re que pour un fd ouvert avec open. Mais leur comportement peut �tre diff�rent � cause de diff�rences d'impl�mentation sp�cifiques aux fichiers et au r�seau. Mais dans un premier temps cela ne devraient pas poser de probl�me je pense.

    Concernant le bind, j'ai eu pas mal de soucis en essayant des adresses du type 127.0.0.1. Donc comme tu l'as fait, avec l'adresse ip de ta machine c'est bien.

    Le message qui dit quelque chose + "already in use" m'est plut�t apparu avec des socket unix (il fallait alors faire unlink(fd)).

    J'ai pas ce probleme avec les socket inet, et je pense que c'est parceque j'utilise un truc du style
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    val = 1;
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
    Je crois sans cela ta socket est inutilisable pendant 5 mins.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    49
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Par d�faut
    Merci pour ta r�ponse Valefor.

    juste avant de lire ton post, j'ai jet� un coup d'oeil sur la faq o� ils expliquaient cette histoire d'adresse already in use.
    Mon socket arrive bien � r�cup�rer les donn�es sur le port que je lui ai sp�cifi�, le bind fonctionne bien et gr�ce � la ligne de code que tu as conseill� on peut r�utiliser une m�me adresse � chaque lancement du programme sans avoir � attendre quelques minutes ...

    Donc pour �a, ya rien � dire, je suis tout content
    Merci Valefor

    Ma socket re�oit des donn�es sur un port que je lui ai sp�cifi�. J'ai demand� � VLC d'envoyer un fichier .ts en streaming sur ce port, ma socket r�cup�re les infos et les envoit au d�multiplexeur / decodeur pour lire la vid�o sur le moniteur.

    Mon soucis est que la vid�o est quasiment illisible : des donn�es re�ues le d�codeur n'arrive quasiement pas � en d�coder...

    Cela vient peut �tre du descripteur de fichier renvoy� par la socket, que je consid�re comme �tant un fichier Unix pour le d�codeur. Quelqu'un-a-t-il une id�e ?

  6. #6
    Membre �m�rite Avatar de valefor
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    711
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 711
    Par d�faut
    Si tu es s�r que ce qui rentre par le cable r�seau est bon, je ne vois pas trop d'o� peut venir ton probl�me.

    Par contre si tu as un doute (vlc encapsule, probl�me d'endianess, ou autre), tu peux �crire un petit programme "serveur" qui lit ton fichier et qui l'envoi vers ton programme.

    Autre solution plus simple, tu demande � VLC de t'envoyer un ficher foo.txt dans lequel tu met "hello world", et tu affiches ce qui sort de ta chaussette.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    49
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Par d�faut
    Et bien, j'avais pens� � cette id�e de petit programme serveur qui recr�e un fichier r�cup�r� sur le port sur lequel �met VLC et apr�s, essayer de le lire par mon d�codeur. Je vais sans doute essayer �a, mais avant j'essaie de passer les donn�es autrement au d�codeur qu'avec un descripteur de fichier (celui de la socket).
    Comme je ne suis pas l'auteur du code source du d�codeur, il faut que je me plonge dedans pour trouver le buffer d'entr�e et le remplir � l'aide de la fonction recv (). C'est une piste que j'�tudie depuis hier soir

    En tout cas, tes id�es sont tr�s bonnes ...
    Je te tiens au courant !

    Merci bien.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. File descriptor socket
    Par _niko_ dans le forum R�seau
    R�ponses: 2
    Dernier message: 07/10/2011, 11h51
  2. Erreur : Bad file descriptor sur socket
    Par TariC dans le forum R�seau
    R�ponses: 2
    Dernier message: 22/11/2010, 20h31
  3. pid du process parent du file descriptor du socket
    Par marion5515 dans le forum R�seau
    R�ponses: 4
    Dernier message: 27/08/2010, 15h13
  4. R�ponses: 0
    Dernier message: 18/11/2007, 20h53
  5. [SOCKET] Fonction bind()
    Par chacal dans le forum D�veloppement
    R�ponses: 13
    Dernier message: 19/12/2005, 14h22

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