-
Notifications
You must be signed in to change notification settings - Fork 0
/
tcp.c
73 lines (57 loc) · 2.4 KB
/
tcp.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
65
66
67
68
69
70
71
/******************************************************************************
* This file is part of The Ekans Webserver. *
* Copyright (C) 2011 Samuel C. Payson *
* *
* Ekans is free software: you can redistribute it and/or modify it under the *
* terms of the GNU General Public License as published by the Free Software *
* Foundation, either version 3 of the License, or (at your option) any later *
* version. *
* *
* Ekans is distributed in the hope that it will be useful, but WITHOUT ANY *
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS *
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more *
* details. *
* *
* You should have received a copy of the GNU General Public License along *
* with Ekans. If not, see <http://www.gnu.org/licenses/>. *
******************************************************************************/
#include <string.h>
#include "tcp.h"
/* This code is largely based off of examples from "Beej's Guide to Network *
* Programming." */
SOCK get_listener(const char * port) {
SOCK sockfd;
struct addrinfo hints, * servinfo, * p;
int yes = 1;
int rv;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
if ((rv = getaddrinfo(NULL, port, &hints, &servinfo)) != 0) {
return -1;
}
for(p = servinfo; p != NULL; p = p->ai_next) {
if ((sockfd = socket(p->ai_family, p->ai_socktype,
p->ai_protocol)) == -1) {
continue;
}
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,
sizeof(int)) == -1) {
return -1;
}
if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
close(sockfd);
continue;
}
break;
}
if (p == NULL) {
return -1;
}
freeaddrinfo(servinfo);
if (listen(sockfd, 10) == -1) {
return -1;
}
return sockfd;
}