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 :

Probleme de sendto() et de rcvfrom qui renvoit Illegal Seek


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 19
    Par défaut Probleme de sendto() et de rcvfrom qui renvoit Illegal Seek
    Bonjour,

    Je suis en train d'essayer de programmer un serveur et un client en mode UDP mais perror me renvoi juste apres sendto() et rcvfrom() : Illegal Seek...

    Malheuresement je n'arrive pas a voir d'ou vient le problème.

    Voici mes deux codes :

    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
    #include <netinet/in.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <string.h>
    #include <stdio.h>
    #include <errno.h>
     
    #define PORT_A 2110
     
    int main()
      {
      struct sockaddr_in adr_client;
      struct hostent *host;
      int len_adr_client;
      int desc;
      int i;
      char buffer[4];
      char *localhost="localhost";
     
      if((desc = socket(AF_INET, SOCK_DGRAM, 0))<0)
        perror("Socket");
     
      adr_client.sin_family = AF_INET;
     
      if((host = gethostbyname(localhost)) == NULL)
        perror("Gethostbyname");
     
      (void) bcopy( (char *)(*host).h_addr, (char *) &adr_client.sin_addr, (*host).h_length );
     
      adr_client.sin_port = htons(PORT_A);
     
      len_adr_client = sizeof(adr_client);
     
      printf("Numéro de port = %i\n", PORT_A);
     
      for(i=0;i<5;i++)
        {
        sprintf(buffer, "%i", i);
     
        if((sendto(desc, buffer, strlen(buffer)+1, 0, (struct sockaddr *)&adr_client, len_adr_client))<0);
          perror("SendTo");
     
        printf("Truc envoyé\n");
        fflush(stdout);
        }
     
      return 0;
      }
    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
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <sys/uio.h>
    #include <netinet/in.h>
    #include <stdio.h>
     
    #define PORT_A 2110
     
    int main()
      {
      int i;
      int sock_rdv;
      int sock_service;
      int len_adr_client;
      int len_adr_serveur;
      int end;
      struct sockaddr_in adr_machine;
      struct sockaddr_in adr_client;
      char buffer[256];
     
      if((sock_rdv = socket(AF_INET, SOCK_DGRAM, 0))<0)
        perror("Socket");
     
      adr_machine.sin_port = htons(PORT_A);
      adr_machine.sin_addr.s_addr = INADDR_ANY;
      adr_machine.sin_family = AF_INET;
     
      printf("Numéro de port = %i\n", PORT_A);
      fflush(stdout);
     
      len_adr_serveur = sizeof(adr_machine);
     
      if((bind(sock_rdv, (struct sockaddr *)&adr_machine, len_adr_serveur))<0)
        perror("Bind");
     
      len_adr_client = sizeof(adr_client);
     
      while(1)
        {
        if((end=recvfrom(sock_rdv, buffer, strlen(buffer)+1, 0, (struct sockaddr *)&adr_machine, &len_adr_serveur))<0);
          perror("RecvFrom");
     
        buffer[end] = '\0';
     
        printf("Texte recu : %s\n",buffer);
        fflush(stdout);
        }
      return 0;
      }
    Merci d'avance.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Par défaut
    if((sendto(desc, buffer, sizeof(buffer), 0, (struct sockaddr *)&adr_client, len_adr_client))<0);


    end=recvfrom(sock_rdv, buffer, sizeof(buffer), 0, (struct sockaddr *)&adr_machine, &len_adr_serveur))<0);

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 19
    Par défaut
    Ca ne change pas grand chose.

    En fait je ne recois "illegal seek" que lorsque i a pour valeur de 1 à 4.
    C'est a dire que lorsque i=0 ca fonctionne mais qu'apres perror() renvoi illegal seek... mais je recoit malgré tout la donnée voulu...

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Petite remarque (qui n'est pas censée résoudre le problème) : l'appel de " socket(AF_INET, SOCK_DGRAM, 0) " n'est pas tout à fait correct, il faudrait écrire " socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) ".
    "AF" veut dire "Adresse Family" alors que quand on crée une socket on spécifie une "Protocol Family" et "IPPROTO_UDP" a plus de sens que "0".

    Sinon, ça donne quoi avec le flag MSG_NOSIGNAL ?

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char buffer[4];
    int i;
    ...
    sprintf(buffer, "%i", i);
    tu met un entier dans un tableau de char

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 19
    Par défaut
    Citation Envoyé par David.Schris
    Sinon, ça donne quoi avec le flag MSG_NOSIGNAL ?
    Cela ne change rien au retour de perror().
    Ce qui m'etonne c'est que malgré l'erreur ca fonctionne quand meme

    Citation Envoyé par Scriptoff
    tu met un entier dans un tableau de char
    La fonction sprintf() permet de faire la conversion

  7. #7
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    As-tu bien enlevé les ';' après tes if comme je pense le disais scriptoff... Un peu de texte n'aurais pas été du luxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
          if ((sendto(desc, buffer, strlen (buffer) + 1, 0,
                       (struct sockaddr *) &adr_client, len_adr_client)) < 0);
              perror ("SendTo");
    doit devenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          if ((sendto(desc, buffer, strlen (buffer) + 1, 0,
                       (struct sockaddr *) &adr_client, len_adr_client)) < 0) {
              perror ("SendTo");
          }
    Bon les accolades ne sont pas obligatoires mais vraiment conseillées...
    Jc

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 21/11/2006, 11h44
  2. Réponses: 7
    Dernier message: 17/10/2006, 12h32
  3. probleme avec un programme en JS qui realise des calculs
    Par leclone dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 17/09/2006, 18h09
  4. [SQL2K]Procédure stockée qui renvoit deux fois le résultat
    Par neuropathie dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/05/2006, 16h38
  5. Réponses: 8
    Dernier message: 30/12/2005, 13h47

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