-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcreate_server.c
64 lines (59 loc) · 2.2 KB
/
create_server.c
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
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* create_server.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: edelangh <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2015/02/01 16:32:48 by edelangh #+# #+# */
/* Updated: 2015/05/08 17:41:34 by edelangh ### ########.fr */
/* */
/* ************************************************************************** */
# include "libft.h"
# include <sys/socket.h>
# include <netdb.h>
# include <arpa/inet.h>
# include "ft_printf.h"
t_sock create_server_ipv6(int port, char *proto_name)
{
t_sock server;
t_protoent *proto;
t_sockaddr_in6 sin;
int yes;
server = 0;
proto = getprotobyname(proto_name);
if (proto && (server = socket(PF_INET6, SOCK_STREAM, proto->p_proto)) < 0)
return (create_server_ipv4(port, proto_name));
sin.sin6_family = AF_INET6;
sin.sin6_addr = in6addr_any;
sin.sin6_port = htons(port);
yes = 1;
setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
if ((bind(server, (const t_sockaddr*)&sin, sizeof(sin))) < 0)
return (create_server_ipv4(port, proto_name));
listen(server, MAX_CLIENT_NBR);
return (server);
}
t_sock create_server_ipv4(int port, char *proto_name)
{
t_sock server;
t_protoent *proto;
t_sockaddr_in sin;
int yes;
server = 0;
proto = getprotobyname(proto_name);
if (proto && (server = socket(PF_INET, SOCK_STREAM, proto->p_proto)) < 0)
{
perror("create_server :");
return (-1);
}
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
sin.sin_addr.s_addr = htonl(INADDR_ANY);
yes = 1;
setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
if ((bind(server, (const t_sockaddr*)&sin, sizeof(sin))) < 0)
return (-1);
listen(server, MAX_CLIENT_NBR);
return (server);
}