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);
}