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 socket UNIX TCP: SIGPIPE


Sujet :

Réseau C

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Par défaut Probleme socket UNIX TCP: SIGPIPE
    Bonjour,
    Je tente de coder un simple serveur en tcp. Jusqu'ici la connection avait l'air de fonctionner mais lorsque je tente un write sur mon socket je recoit l'erreur EPIPE et mon programme est interrompu par le signal SIGPIPE. Je ne parvient pas a comprendre d'ou cela peut bien venir.
    Je ne souhaite pas non plus utiliser de select ou de send pour passer en non-bloquant car j'aimerai avant tout bien comprendre le fonctionnement d'une socket.

    Voila mon code en bazar dans mon main:
    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
     
    typedef struct protoent		t_protoent;
    typedef	struct sockaddr_in	t_s_addr_in;
     
    int	main(int ac, char **av)
    {
      t_protoent	*prot;
      t_s_addr_in	sa_in;
      t_s_addr_in	sa_client;
      socklen_t	client_addr_len;
      char		*client_addr;
      char		*str;
      char		*test;
      int		port;
      int		tcp_socket;
      int		r;
     
      if (ac < 2)
        exit(EXIT_FAILURE);
      port = atoi(av[1]);
      prot = x_getprotobyname("TCP");
      tcp_socket = x_socket(AF_INET, SOCK_STREAM, prot->p_proto);
      sa_in.sin_family = AF_INET;
      sa_in.sin_port = htons(port);
      sa_in.sin_addr.s_addr = INADDR_ANY;
      x_bind(tcp_socket, (struct sockaddr *) &sa_in, sizeof(sa_in));
      x_listen(tcp_socket, 42);
      client_addr_len = sizeof(sa_client);
      x_accept(tcp_socket, (struct sockaddr *) &sa_client, &client_addr_len);
     
      client_addr = inet_ntoa(sa_client.sin_addr);
      printf("Client address: %s\n", client_addr);
      str = strdup("Welcome home.");
      printf("prepare to send: %s\n", str);
      r = x_write(tcp_socket, str, strlen(str));
      printf("write %d bytes = %s\n", r, str);
      free(str);
     
      x_close(tcp_socket);
      return (EXIT_SUCCESS);
    }
    mes fonctions "x":
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    t_protoent	*x_getprotobyname(const char *name)
    {
      t_protoent	*ret;
     
      if (!(ret = getprotobyname(name)))
        exit(EXIT_FAILURE);
      return (ret);
    }
     
    int		x_socket(int domain, int type, int protocol)
    {
      int	ret;
     
      if ((ret = socket(domain, type, protocol)) == -1)
        exit(EXIT_FAILURE);
      return (ret);
    }
     
    int		x_close(int fd)
    {
      int	ret;
     
      if ((ret = close(fd)) == -1)
        exit(EXIT_FAILURE);
      return (ret);
    }
     
    int	x_bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
    {
      int	ret;
     
      if ((ret = bind(sockfd, addr, addrlen)) == -1)
        {
          x_close(sockfd);
          exit (EXIT_FAILURE);
        }
      return (ret);
    }
     
    int	x_listen(int sockfd, int backlog)
    {
      int	ret;
     
      if ((ret = listen(sockfd, backlog)) == -1)
        {
          x_close(sockfd);
          exit (EXIT_FAILURE);
        }
      return (ret);
    }
     
    int	x_accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
    {
      int	ret;
     
      if ((ret = accept(sockfd, addr, addrlen)) == -1)
        {
          x_close(sockfd);
          exit (EXIT_FAILURE);
        }
      return (ret);
    }
     
    int	x_write(int fd, char *buf, size_t count)
    {
      int	ret;
      char	*sterr;
     
        if ((ret = write(fd, buf, count)) < 0)
        {
          asprintf(&sterr, "write error: %d\n", errno);
          perror(sterr);
          x_close(fd);
          free(sterr);
          exit (EXIT_FAILURE);
        }
      return (ret);
    }
     
    int	x_read(int fd, void *buf, size_t count)
    {
      int ret;
     
      if ((ret = read(fd, buf, count)) < 0)
        {
          x_close(fd);
          exit (EXIT_FAILURE);
        }
      return (ret);
    }

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Par défaut
    je viens de trouver il fallait recuperer le retour de accept.
    voila ce qui se passe quand on lit les man en diagonale...

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

Discussions similaires

  1. Probleme: Chat avec les sockets en tcp avec du C
    Par mansour67 dans le forum Réseau
    Réponses: 6
    Dernier message: 06/07/2012, 20h26
  2. client/server tcp, probleme socket
    Par Misaki dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 20/12/2007, 09h46
  3. [Socket] Probleme de segment TCP
    Par zwoke dans le forum C#
    Réponses: 2
    Dernier message: 05/04/2007, 10h09
  4. server de sockets unix et tcp/ip en mm tps?
    Par iznogoud36 dans le forum Linux
    Réponses: 7
    Dernier message: 02/01/2007, 08h58
  5. write() dans une socket.. unix
    Par slack dans le forum Réseau
    Réponses: 5
    Dernier message: 18/12/2002, 20h42

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