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 :

Pointeur de SOCKET ou non?


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    Par défaut Pointeur de SOCKET ou non?
    Bonjour,
    Je voudrai développé ma propre fonction de fermeture de socket.
    Ma fonction s'appelle close_socket_s et fait appel à close (linux) ou closesocket(windows).
    Mon problème est le type de paramètre qu'il faut lui donner:
    - close_socket_s(SOCKET * sock)
    ou
    - close_socket_s(SOCKET sock)
    D'après moi un SOCKET et un int donc il faudrait logiquement passer en paramètre un pointeur de socket.
    Mais d'après les tests que j'ai fait les deux ont l'air de fonctionner.
    Je n'ai fait mes tests que sous windows xp.

    close_socket_s(SOCKET sock):
    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
    BOOL close_socket_s(SOCKET socket){
    	BOOL ret = TRUE;
    #if defined (WIN32)
    		if(closesocket(socket) == SOCKET_ERROR)
    		{
    			if( DISPLAY_ERROR_MESSAGE )
    				display_socket_error("Error.close_socket_s().closesocket()");
    			ret = FALSE;
    		}
    #else
    		if(close(socket) == SOCKET_ERROR)
    		{
    			if( DISPLAY_ERROR_MESSAGE )
    				display_socket_error("Error.close_socket_s().close()");
    			ret = FALSE;
    		}
    #endif
    	}
    	return ret;	
    }
    close_socket_s(SOCKET * sock):
    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
    BOOL close_socket_s(SOCKET * socket){
    	BOOL ret = TRUE;
    	if( socket == NULL )
    	{
    		if ( DISPLAY_ERROR_MESSAGE )
    			fprintf(stderr, "Error.close_socket_s(): socket is NULL.\r\n");
    		ret = FALSE;
    	}
    	else
    	{
    #if defined (WIN32)
    		if(closesocket(*socket) == SOCKET_ERROR)
    		{
    			if( DISPLAY_ERROR_MESSAGE )
    				display_socket_error("Error.close_socket_s().closesocket()");
    			ret = FALSE;
    		}
    #else
    		if(close(*socket) == SOCKET_ERROR)
    		{
    			if( DISPLAY_ERROR_MESSAGE )
    				display_socket_error("Error.close_socket_s().close()");
    			ret = FALSE;
    		}
    #endif
    	}
    	return ret;	
    }
    Sous windows le type de SOCKET est bien aussi un int? J'ai cherché dans les msdn sans résultats.

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Pourquoi un pointeur ?

    SOCKET ce ne serait pas plutot un unsigned int (ca devrait suffir non ?) j'ai pas trouvé dans msdn non plus...
    Tu peux regarder sinon dans le fichier winsock32.h mais bon...

  3. #3
    Membre éprouvé Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    Par défaut
    Je pense que OSCKET doit être transmis par référence (en tant que pointeur) afin de pouvoir agir sur la variable d'origine et fermé la socket.
    Quand on transmet un paramètre directement on ne modifie pas la variable d'origine:
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void inc(i){
    i++;
    }
     
    int main(){
    int i=0;
    inc(i);
    printf("%d",i);
    return 0;
    }
    affichera toujours 0.
    C'est pourquoi je pense si je fais un close_socket_s(SOCKET sock)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    BOOL close_socket_s(SOCKET sock){
    ...
    closesocket(sock);
    ...
    }
     
    int main(){
    ...
    SOCKET sock;
    ...
    close_socket_s(sock);
    ...
    }
    Je ne fermerai pas vraiment la SOCKET? Si?

  4. #4
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Beh tu ne veux pas modifier la socket (d'ailleurs quel sens cela aurait ?) tu veux juste l'utiliser.

  5. #5
    Membre éprouvé Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    Par défaut
    Ba si je veux le fermer c'est que je le modifie non?

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par psyphi
    Ba si je veux le fermer c'est que je le modifie non?
    Tu demandes au système de faire les modifs. Toi, tu ne modifies rien.

    quand on fait close (sock), on ne passe pas une adresse... C'est un scalaire (entier), c'est tout.

    Après, rien ne t'empêche, à-la-main, de modifier la valeur de la variable socket en INVALID_SOCKET (Windows) ou -1 (Unixoide). Mais ça va laisser le système totalement indifférent...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       close (sock), sock = INVALID_SOCKET;
    Par contre, ça peut avoir un rôle fonctionnel dans l'application.

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

Discussions similaires

  1. Socket - read non bloquant alors qu'il devrait être bloquant
    Par _LittleFlea_ dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 04/04/2011, 10h54
  2. Socket lecture non bloquante
    Par Darkthur dans le forum Multithreading
    Réponses: 2
    Dernier message: 22/05/2009, 18h28
  3. Socket UDP non accessible via le web
    Par guish59 dans le forum Réseau
    Réponses: 8
    Dernier message: 12/12/2008, 22h45
  4. Pointeur long et adresse non multiple de 4
    Par _Michel dans le forum C
    Réponses: 5
    Dernier message: 10/12/2007, 13h54
  5. Réponses: 1
    Dernier message: 03/09/2007, 17h40

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