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 :

socket send renvoi toujours (-1)


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 36
    Points : 23
    Points
    23
    Par défaut socket send renvoi toujours (-1)
    Hello a tous j’ais un petit problème avec le code suivent je tente d’envoilé un send a travers le sockete que j’ai ouvert mais le send me renvoi toujours (-1)

    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
     
    #include <stdio.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <fcntl.h>
     
    int main(int argc, char **argv)
    {
    	int sockfd; 
    	int len; 
    	struct sockaddr_in address; 
    	int result; 
     
        	fd_set rfds;
        	struct timeval tv;
        	int retval;
    		int nbRecu=0;
    		int bind_t=0;
     
     
        	tv.tv_sec = 0;
        	tv.tv_usec = 100000;
     
     
    	sockfd = socket(AF_INET, SOCK_STREAM, 0); 
     
     
    	FD_ZERO(&rfds);
        FD_SET(sockfd, &rfds);
     
    	address.sin_family = AF_INET; 
    	address.sin_addr.s_addr = inet_addr(argv[1]); 
    	address.sin_port = 445; 
    	len = sizeof(address); 
     
    	fcntl(sockfd, F_SETFL, O_NONBLOCK);
     
    	result = connect(sockfd, (struct sockaddr *)&address, len); 
    	bind_t = bind(sockfd, (struct sockaddr *)&address,len);
    	nbRecu = send(sockfd, "Hello world!\r\n", 14, 0);
    	retval = select(sockfd + 1, &rfds, NULL, NULL, &tv);
    	//nbRecu = send(sockfd, "Hello world!\r\n", 14, 0); 
     
        	if (retval)
    		{
    			if(nbRecu == -1)
    			{
    				close(sockfd); 
    	        	printf("socket 445 ok\n");
    	        	return 1;
    			}
    			else
    			{				
    				close(sockfd); 
    	        	printf("donne 445 ok\n");
    	        	return 1;
    			}
        	}
    		else
    		{
    	    	close(sockfd); 
            	printf("Pas de données depuis 100 mili secondes\n");
            	return 0;
        	}
     
    }

  2. #2
    Membre confirmé Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Points : 489
    Points
    489
    Par défaut
    Salut
    Déclaration implicite de close() -> inclure stdlib.h
    De plus, l'appli lancée sans argument produit une erreur de segmentation.

    Il faut débuguer tout ça au fur et à mesure.

    * Tester la création du socket. si valeur inférieure à 0, il n'a pas été créé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      if ( (sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
      {
        puts("> Impossible de créer le socket");
        exit(1);
      }
    * Tester la valeur de retour de connect(). Si inférieure à zéro, la connection n'a pas été établie. Je comprend pas pourquoi tu utilises la variable result sans regarder ce qu'elle contient?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      if(connect(sockfd,(struct sockaddr *)&adress, len) < 0)
      {
        puts("> Problème sur connect()");
        exit(2);
      }
      else printf("> Connecté au serveur %s (%s)\n",serveur, inet_ntoa(serveurSockAddr.sin_addr));
    Dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbRecu = send(sockfd, "Hello world!\r\n", 14, 0);
    Le nom de la variable Nbreçu n'est vraiment pas approprié. NbEnvoyé peut-être?

    Il semble que l' appli est un client: pas besoin de bind.

    Pour le reste, en admettant que les règles de filtrage du firewall sont définies,
    que l' appli tourne en root (en effet les 1024 premiers ports sont des ports réservés)
    que le modem n'est pas débranché, qu'un serveur est effectivement à l' écoute ... Ca devrait le faire.

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 36
    Points : 23
    Points
    23
    Par défaut > Problème sur connect()
    Merci pour ta réponse j’ai fais les quelles-que modif que tu ma donné et mon code se plante sure le connect voie tu une autre erreur
    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
     
     
    #include <stdio.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <fcntl.h>
    #include <stdlib.h>
     
    int main(int argc, char **argv)
    {
    	int sockfd; 
    	int len; 
    	struct sockaddr_in address; 
    	int result; 
     
        	fd_set rfds;
        	struct timeval tv;
        	int retval;
    		int nbRecu=0;
    		int bind_t=0;
     
     
        	tv.tv_sec = 0;
        	tv.tv_usec = 100000;
     
     
    if ( (sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
    {
       puts("> Impossible de créer le socket");
       exit(1);
    }
     
     
    	FD_ZERO(&rfds);
        FD_SET(sockfd, &rfds);
     
    	address.sin_family = AF_INET; 
    	address.sin_addr.s_addr = inet_addr(argv[1]); 
    	address.sin_port = 1025; 
    	len = sizeof(address); 
     
    	fcntl(sockfd, F_SETFL, O_NONBLOCK);
     
    if(connect(sockfd, (struct sockaddr *)&address, len) < 0)
    {
      puts("> Problème sur connect()");
      exit(2);
    }
     
    nbRecu = send(sockfd, "Hello world!\r\n", 14, 0);
    retval = select(sockfd + 1, &rfds, NULL, NULL, &tv);
    	//nbRecu = send(sockfd, "Hello world!\r\n", 14, 0); 
     
        	if (retval)
    		{
    			if(nbRecu == -1)
    			{
    				close(sockfd); 
    	        	printf("socket 445 ok\n");
    	        	return 1;
    			}
    			else
    			{				
    				close(sockfd); 
    	        	printf("donne 445 ok\n");
    	        	return 1;
    			}
        	}
    		else
    		{
    	    	close(sockfd); 
            	printf("Pas de données depuis 100 mili secondes\n");
            	return 0;
        	}
     
    }

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    Alor quelle port supérieur a 1024 sur un win xp standard pourrais me répondre

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par tkwebch
    Alor quelle port supérieur a 1024 sur un win xp standard pourrais me répondre
    A toi de lancer un serveur avec un port >= 1024 en écoute.
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    Le port inferieur a 1024 peut il également me provoqué une erreur sure le connect ou sa me bloque juste le send ??

  7. #7
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Le send peut bloquer... ou ne pas bloquer, cela dépend du port.

    Si il y a déjà un socket ouvert il va s'ouvrir.

    Si il n'y a pas de socket en écoute, une erreur de connexion va être retournée, en indiquant que le socket n'a pu se connecter.

  8. #8
    Membre confirmé Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Points : 489
    Points
    489
    Par défaut
    Ah... Sous windows il n' y a pas ce problème de ports réservés, n'importe qui peut écouter sur le 80 ou 25. Au vu des includes j'ai cru que tu étais sous nix.

    Attends windows tu dis? Alors ou sont les fonctions WSA?? Ou est l'inclusion de l' en-tête winsock ou winsock2? Aussi c'est un descripteur SOCKET, pas un int!

    Le port. Faut le passer dans l' ordre réseau.
    address.sin_port = htons(1927);

    Ce tutorial est bien fait avec plein d' exemples
    http://beej.us/guide/bgnet/

    Salut Ti-R

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Lunixinclar
    Ce tutorial est bien fait avec plein d' exemples
    http://beej.us/guide/bgnet/

    Salut Ti-R
    Existe en français :

    http://vidalcharles.free.fr/lf/socket.html
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/12/2010, 13h18
  2. isdigit() renvoie toujours 0
    Par gangsoleil dans le forum C
    Réponses: 30
    Dernier message: 07/08/2006, 13h42
  3. [MySQL] Mon SELECT COUNT me renvoie toujours 1
    Par diaboloche dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 11/07/2006, 11h53
  4. [Socket] Send/Recv type double sur architectures différentes
    Par nicolas.pied dans le forum Réseau
    Réponses: 4
    Dernier message: 31/03/2006, 20h33
  5. Réponses: 2
    Dernier message: 16/04/2005, 20h24

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