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 :

Recv renvoie -1 (sous windows)


Sujet :

Réseau C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 96
    Par défaut Recv renvoie -1 (sous windows)
    Bonjour,

    D'où pourrait provenir le fait qu'un recv, sous windows, est systématiquement égal à -1, alors que le send qui précède est correct ?

    la valeur -1 ne devrait-elle pas, théoriquement, être renvoyée sous linux seulement ?

    Je ne vois pas le problème dans mon appel à cette fonction : recv est appelée sur le serveur et j'utilise bien le socket du client pour ceci.

    Auriez-vous une idée de la source du problème ?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par theawe Voir le message
    la valeur -1 ne devrait-elle pas, théoriquement, être renvoyée sous linux seulement ?
    Euh... Pourquoi?

    Pour le reste de ton problème, impossible de répondre sans plus d'infos.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 96
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Euh... Pourquoi?
    J'avais lu sur un tutoriel que la valeur de retour, en cas d'erreur, était SOCKET_ERROR sous windows ou -1 sous linux. Cependant, SOCKET_ERROR doit sans doute correspondre à une valeur numérique, donc peut-être -1 du coup...

    Citation Envoyé par Médinoc Voir le message
    Pour le reste de ton problème, impossible de répondre sans plus d'infos.
    L'erreur générée est l'erreur 183 (identifiée avec WSAGetLastError()). Erreur 183 : "Cannot open a file when that file already exists." Je n'ouvre pourtant le fichier qu'après l'appel de recv. Je ne comprends pas vraiment pour cette fois-ci je ne parviens pas à recevoir mon message.

    Le client appel send pour envoyer son message. L'appel de send ne génère pas d'erreur : les paramètres ont été vérifiés et sont corrects.

    Le serveur appel recv pour récupérer ce message mais une erreur est générée.

    Toutes les déclarations concernant les sockets, les SOCKADDR_IN, WSADATA et WSAStartup sont corrects. Le serveur reçoit correctement l'appel de connexion du client et l'accepte sans erreur.

    Je n'ai pas plus d'informations à donner.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Peux-tu poster ton code, au moins depuis l'appel à send() jusqu'à l'appel à WSAGetLastError(), en passant par l'appel à recv()?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut
    sous windows, SOCKET_ERROR est une macro qui correspond à -1

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 96
    Par défaut
    Côté 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
     
    if (connect(socketClient, (SOCKADDR *)&sin, sizeof(sin)) == 0)//Si connexion
    {
    	CString message = m_strId + m_strPass;
     
    	m_bufferSend = new char[50];
    	std::string strMessage = CT2A(message);
    	m_bufferSend = strMessage.c_str();
    	if(send(socketClient, m_bufferSend, message.GetLength(), 0) != SOCKET_ERROR)
    	{
    		m_bufferRecv = new char[3];
    		if(recv(socketClient, m_bufferRecv, sizeof(m_bufferRecv), 0) != SOCKET_ERROR)
    		{
    			CString messageRecv(m_bufferRecv, sizeof(m_bufferRecv));
    			if(messageRecv == "yes")
    			{
    				bConnected == true;
    				AfxMessageBox("La connexion est établie.");
    			}
    		}
    	}
    }
    Côté 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
     
    if((socketClient == accept(socketServeur, (SOCKADDR *)&sinClient, &sinsize)) != INVALID_SOCKET)
    {
     
    	int i = 0;
    	i = recv(socketClient, m_bufferRecv, sizeof(m_bufferRecv), 0);
     
    	FILE * pFile = fopen("test_Recv.txt", "a");
    	fprintf(pFile, "Recv = %d\n", i);
    	fprintf(pFile, "recv failed: %d\n", WSAGetLastError());
    	fclose(pFile);
     
    /* traitements */
    }
    Edit : j'ai fait un appel à WSAGetLastError() juste après l'appel de recv. L'erreur est en fait 10038 : Ici

    C'est la première fois que je rencontre cette erreur et pourtant je n'ai ni changé de PC, ni changé d'adresse IP.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Attention, ton utilisation de sizeof est incorrecte.
    De plus, tu devrais appeler WSAGetLastError() avant le fopen(), car fopen() repose sur l'API Win32 et peut modifier le LastError (sous Win32, il n'y a pas de LastError séparé entre WSA et le reste).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 96
    Par défaut
    Je viens de tester la communication en utilisant une autre application Client-Serveur faite la semaine dernière et je ne rencontre aucun problème.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 96
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Attention, ton utilisation de sizeof est incorrecte.
    Pourquoi cela ?

    voici ce qui dit msdn à propos de mon erreur :
    Socket operation on nonsocket.

    An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid.


    Pourtant je passe bien dans ma condition de vérification de validité du socket...

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par theawe Voir le message
    Pourquoi cela ?
    sizeof sur un pointeur donne la taille du pointeur, pas du tableau pointé...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 96
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    sizeof sur un pointeur donne la taille du pointeur, pas du tableau pointé...
    Je déclare mon buffer de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char m_bufferRecv[2048];
    Que je mette 2048 ou la taille du message à recevoir directement en paramètre à la place de sizeof(m_bufferRecv), le problème reste le même.

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Code client : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		m_bufferRecv = new char[3];
    		if(recv(socketClient, m_bufferRecv, sizeof(m_bufferRecv), 0) != SOCKET_ERROR)
    D'accord, c'est le serveur qui foire, mais tu as quand même une erreur sur le client...

    Edit: J'ai trouvé l'erreur! Il y a un '=' de trop dans la ligne du accept()...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 96
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Code client : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		m_bufferRecv = new char[3];
    		if(recv(socketClient, m_bufferRecv, sizeof(m_bufferRecv), 0) != SOCKET_ERROR)
    D'accord, c'est le serveur qui foire, mais tu as quand même une erreur sur le client...
    Je vais modifier ça tout de suite. Je pensais que tu parlais du sizeof(m_bufferRecv) du côté serveur...

    Citation Envoyé par Médinoc Voir le message
    [CODE=client]
    Edit: J'ai trouvé l'erreur! Il y a un '=' de trop dans la ligne du accept()...
    Ah ! Super, merci...

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

Discussions similaires

  1. Probleme de Createthread et de recv sous windows mobile
    Par Sotoaleono dans le forum Windows
    Réponses: 3
    Dernier message: 18/11/2009, 22h04
  2. Réponses: 10
    Dernier message: 18/06/2008, 13h44
  3. Problème d'utilisation select () avant recv sous windows
    Par init dans le forum Développement
    Réponses: 3
    Dernier message: 16/03/2005, 19h36
  4. Pas de fork sous Windows?
    Par chezjm dans le forum POSIX
    Réponses: 8
    Dernier message: 11/06/2002, 12h15
  5. OmniORB : code sous Windows et Linux
    Par debug dans le forum CORBA
    Réponses: 2
    Dernier message: 30/04/2002, 17h45

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