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