Commit c6635e3904476c1ccd7b2e045840a73791a97d6b
1 parent
d2848c0b
more work on socket handling stuff... @TODO think about renaming it to connectio…
…n as it only handles TCP sockets
Showing
9 changed files
with
181 additions
and
96 deletions
... | ... | @@ -14,7 +14,8 @@ CLASS(SOCK) { |
14 | 14 | int handle; /* socket handle for server */ |
15 | 15 | }; |
16 | 16 | |
17 | -void sock_initServer(SOCK this, int backlog); | |
17 | +void sock_connect(SOCK this, const char * addr); | |
18 | +void sock_listen(SOCK this, int backlog); | |
18 | 19 | SOCK sock_accept(SOCK this, char remoteAddr[16]); |
19 | 20 | |
20 | 21 | #endif /* __SOCKET_H__ */ | ... | ... |
... | ... | @@ -23,7 +23,7 @@ __construct(SERVER) |
23 | 23 | FD_ZERO(&(this->fdset)); |
24 | 24 | |
25 | 25 | this->sock = new(SOCK, port); |
26 | - sock_initServer(this->sock, backlog); | |
26 | + sock_listen(this->sock, backlog); | |
27 | 27 | |
28 | 28 | this->max_fd = this->sock->handle; |
29 | 29 | FD_SET(this->sock->handle, &(this->fdset)); | ... | ... |
... | ... | @@ -17,28 +17,10 @@ INIT_CLASS(SOCK); |
17 | 17 | |
18 | 18 | __construct(SOCK) |
19 | 19 | { |
20 | - this->logger = va_arg(* params, struct _logger *); | |
21 | - this->port = va_arg(* params, int); | |
22 | -} | |
23 | - | |
24 | -__destruct(SOCK) | |
25 | -{ | |
26 | - if (0 != this->handle) { | |
27 | - shutdown(this->handle, SHUT_RDWR); | |
28 | - close(this->handle); | |
29 | - } | |
30 | -} | |
31 | - | |
32 | -__jsonConst(SOCK) {} | |
33 | -__toJson(SOCK) {} | |
34 | -__clear(SOCK) {} | |
20 | + int reUse = 1; /* TODO: make this configurable */ | |
35 | 21 | |
36 | - | |
37 | -void | |
38 | -sock_initServer(SOCK this, int backlog) | |
39 | -{ | |
40 | - struct sockaddr_in addr; /* Local address */ | |
41 | - int reUse = 1; /* TODO: make this configurable */ | |
22 | + this->logger = va_arg(* params, LOGGER); | |
23 | + this->port = va_arg(* params, int); | |
42 | 24 | |
43 | 25 | /* Create socket for incoming connections */ |
44 | 26 | if (-1 == (this->handle = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP))) { |
... | ... | @@ -48,66 +30,20 @@ sock_initServer(SOCK this, int backlog) |
48 | 30 | exit(EXIT_FAILURE); |
49 | 31 | } |
50 | 32 | |
51 | - /* Make the socket REUSE a TIME_WAT socket */ | |
33 | + /* Make the socket REUSE a TIME_WAIT socket */ | |
52 | 34 | setsockopt(this->handle, SOL_SOCKET, SO_REUSEADDR, &reUse, sizeof (reUse)); |
53 | - | |
54 | - /* Construct local address structure */ | |
55 | - memset(&addr, 0, sizeof(addr)); /* Zero out structure */ | |
56 | - | |
57 | - addr.sin_family = AF_INET; /* Internet address family */ | |
58 | - addr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */ | |
59 | - addr.sin_port = htons(this->port); /* Local port */ | |
60 | - | |
61 | - /* Bind to the local address */ | |
62 | - if (-1 == bind(this->handle, (struct sockaddr *) &addr, sizeof(addr))) { | |
63 | - logger_log(this->logger, LOGGER_CRIT, | |
64 | - "error binding socket: %s - service terminated", | |
65 | - strerror(errno)); | |
66 | - exit(EXIT_FAILURE); | |
67 | - } | |
68 | - | |
69 | - /* Mark the socket so it will listen for incoming connections */ | |
70 | - if (-1 == listen(this->handle, backlog)) { | |
71 | - logger_log(this->logger, LOGGER_CRIT, | |
72 | - "error binding socket: %s - service terminated", | |
73 | - strerror(errno)); | |
74 | - exit(EXIT_FAILURE); | |
75 | - } | |
76 | 35 | } |
77 | 36 | |
78 | -SOCK | |
79 | -sock_accept(SOCK this, char remoteAddr[16]) | |
37 | +__destruct(SOCK) | |
80 | 38 | { |
81 | - SOCK sock; /* Socket for client */ | |
82 | - struct sockaddr_in addr; /* Client address */ | |
83 | - unsigned int len; /* Length of client address data structure */ | |
84 | - | |
85 | - /* Set the size of the in-out parameter */ | |
86 | - len = sizeof(addr); | |
87 | - | |
88 | - sock = new(SOCK, this->logger, this->port); | |
89 | - /** | |
90 | - * @TODO: change port to remote port on success | |
91 | - */ | |
92 | - | |
93 | - /* Wait for a client to connect */ | |
94 | - if (-1 == (sock->handle = accept(this->handle, (struct sockaddr *) &addr, &len))) { | |
95 | - logger_log(this->logger, LOGGER_WARNING, | |
96 | - "error acception connection: %s", strerror(errno)); | |
97 | - } else { | |
98 | - strncpy (remoteAddr, inet_ntoa(addr.sin_addr), sizeof(remoteAddr)-1); | |
99 | - } | |
100 | - | |
101 | - /* clntSock is connected to a client! */ | |
102 | - /** | |
103 | - * @TODO add verbosity level to logger | |
104 | - */ | |
105 | -// if (0 != this->logger->verbose) { | |
106 | - logger_log(this->logger, LOGGER_INFO, | |
107 | - "handling client %s\n", inet_ntoa(addr.sin_addr)); | |
108 | -// } | |
109 | - | |
110 | - return sock; | |
39 | + if (0 != this->handle) { | |
40 | + shutdown(this->handle, SHUT_RDWR); | |
41 | + close(this->handle); | |
42 | + } | |
111 | 43 | } |
112 | 44 | |
45 | +__jsonConst(SOCK) {} | |
46 | +__toJson(SOCK) {} | |
47 | +__clear(SOCK) {} | |
48 | + | |
113 | 49 | // vim: set ts=4 sw=4: | ... | ... |
src/socket_accept.c
0 → 100644
1 | +#include <stdio.h> /* for printf() and fprintf() */ | |
2 | +#include <sys/types.h> /* SO_REUSEADDR */ | |
3 | +#include <sys/socket.h> /* for socket(), bind(), and connect() */ | |
4 | +#include <arpa/inet.h> /* for sockaddr_in and inet_ntoa() */ | |
5 | +#include <stdlib.h> /* for atoi() and exit() */ | |
6 | +#include <string.h> /* for memset() */ | |
7 | +#include <unistd.h> /* for close() */ | |
8 | +#include <errno.h> /* for errno */ | |
9 | +#include <stdarg.h> | |
10 | + | |
11 | +#include "logger.h" | |
12 | +#include "cclass.h" | |
13 | +#include "socket.h" | |
14 | + | |
15 | +SOCK | |
16 | +sock_accept(SOCK this, char remoteAddr[16]) | |
17 | +{ | |
18 | + SOCK sock; /* Socket for client */ | |
19 | + unsigned int len; /* Length of client address data structure */ | |
20 | + | |
21 | + /* Set the size of the in-out parameter */ | |
22 | + len = sizeof(this->addr); | |
23 | + | |
24 | + sock = new(SOCK, this->logger, this->port); | |
25 | + /** | |
26 | + * @TODO: change port to remote port on success | |
27 | + */ | |
28 | + | |
29 | + /* Wait for a client to connect */ | |
30 | + sock->handle = accept(this->handle, (struct sockaddr *) &(sock->addr), &len); | |
31 | + if (-1 == sock->handle) { | |
32 | + logger_log(this->logger, LOGGER_WARNING, | |
33 | + "error acception connection: %s", strerror(errno)); | |
34 | + } else { | |
35 | + strncpy (remoteAddr, inet_ntoa((sock->addr).sin_addr), sizeof(remoteAddr)-1); | |
36 | + } | |
37 | + | |
38 | + /* clntSock is connected to a client! */ | |
39 | + /** | |
40 | + * @TODO add verbosity level to logger | |
41 | + */ | |
42 | +// if (0 != this->logger->verbose) { | |
43 | + logger_log(this->logger, LOGGER_INFO, | |
44 | + "handling client %s\n", inet_ntoa((this->addr).sin_addr)); | |
45 | +// } | |
46 | + | |
47 | + return sock; | |
48 | +} | |
49 | + | |
50 | +// vim: set ts=4 sw=4: | ... | ... |
src/socket_connect.c
0 → 100644
1 | +#include <stdio.h> /* for printf() and fprintf() */ | |
2 | +#include <sys/types.h> /* SO_REUSEADDR */ | |
3 | +#include <sys/socket.h> /* for socket(), bind(), and connect() */ | |
4 | +#include <arpa/inet.h> /* for sockaddr_in and inet_ntoa() */ | |
5 | +#include <stdlib.h> /* for atoi() and exit() */ | |
6 | +#include <string.h> /* for memset() */ | |
7 | +#include <unistd.h> /* for close() */ | |
8 | +#include <errno.h> /* for errno */ | |
9 | +#include <stdarg.h> | |
10 | + | |
11 | +#include "logger.h" | |
12 | +#include "cclass.h" | |
13 | +#include "socket.h" | |
14 | + | |
15 | + | |
16 | +void | |
17 | +sock_connect(SOCK this, const char * addr) | |
18 | +{ | |
19 | + inet_pton(AF_INET, addr, &((this->addr).sin_addr)); | |
20 | + (this->addr).sin_family = AF_INET; /* Internet address family */ | |
21 | + (this->addr).sin_port = htons(this->port); /* Local port */ | |
22 | + | |
23 | + if (-1 == connect(this->handle, (struct sockaddr*) &(this->addr), sizeof(this->addr))) { | |
24 | + logger_log(this->logger, LOGGER_CRIT, | |
25 | + "error connection socket: %s - service terminated", | |
26 | + strerror(errno)); | |
27 | + exit(EXIT_FAILURE); | |
28 | + } | |
29 | +} | |
30 | + | |
31 | +// vim: set ts=4 sw=4: | ... | ... |
src/socket_listen.c
0 → 100644
1 | +#include <stdio.h> /* for printf() and fprintf() */ | |
2 | +#include <sys/types.h> /* SO_REUSEADDR */ | |
3 | +#include <sys/socket.h> /* for socket(), bind(), and connect() */ | |
4 | +#include <arpa/inet.h> /* for sockaddr_in and inet_ntoa() */ | |
5 | +#include <stdlib.h> /* for atoi() and exit() */ | |
6 | +#include <string.h> /* for memset() */ | |
7 | +#include <unistd.h> /* for close() */ | |
8 | +#include <errno.h> /* for errno */ | |
9 | +#include <stdarg.h> | |
10 | + | |
11 | +#include "logger.h" | |
12 | +#include "cclass.h" | |
13 | +#include "socket.h" | |
14 | + | |
15 | + | |
16 | +void | |
17 | +sock_listen(SOCK this, int backlog) | |
18 | +{ | |
19 | + (this->addr).sin_family = AF_INET; /* Internet address family */ | |
20 | + (this->addr).sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */ | |
21 | + (this->addr).sin_port = htons(this->port); /* Local port */ | |
22 | + | |
23 | + /* Bind to the local address */ | |
24 | + if (-1 == bind(this->handle, (struct sockaddr *) &(this->addr), sizeof(this->addr))) { | |
25 | + logger_log(this->logger, LOGGER_CRIT, | |
26 | + "error binding socket: %s - service terminated", | |
27 | + strerror(errno)); | |
28 | + exit(EXIT_FAILURE); | |
29 | + } | |
30 | + | |
31 | + /* Mark the socket so it will listen for incoming connections */ | |
32 | + if (-1 == listen(this->handle, backlog)) { | |
33 | + logger_log(this->logger, LOGGER_CRIT, | |
34 | + "error binding socket: %s - service terminated", | |
35 | + strerror(errno)); | |
36 | + exit(EXIT_FAILURE); | |
37 | + } | |
38 | +} | |
39 | + | |
40 | +// vim: set ts=4 sw=4: | ... | ... |
... | ... | @@ -4,20 +4,18 @@ TESTS_ENVIRONMENT = valgrind --error-exitcode=123 --leak-check=full --quiet |
4 | 4 | TESTS = cclassTest loggerTest socketTest serverTest |
5 | 5 | check_PROGRAMS = cclassTest loggerTest socketTest serverTest |
6 | 6 | |
7 | -cclassTest_SOURCES = runtest.c cclassTest.c mock/class.c ../src/cclass.c | |
8 | -cclassTest_LDADD = $(LIBOBJS) | |
7 | +SOURCES = runtest.c ../src/cclass.c | |
8 | + | |
9 | +cclassTest_SOURCES = $(SOURCES) cclassTest.c mock/class.c | |
9 | 10 | cclassTest_CFLAGS = -Wall -ggdb -O0 -finline-functions -I ../include -I .. -I . |
10 | 11 | |
11 | -loggerTest_SOURCES = runtest.c loggerTest.c ../src/cclass.c ../src/logger.c | |
12 | -loggerTest_LDADD = $(LIBOBJS) | |
12 | +loggerTest_SOURCES = $(SOURCES) loggerTest.c ../src/logger.c | |
13 | 13 | loggerTest_CFLAGS = -Wall -ggdb -O0 -I ../include -I .. -I . |
14 | 14 | |
15 | -socketTest_SOURCES = runtest.c socketTest.c ../src/cclass.c ../src/logger.c ../src/socket.c | |
16 | -socketTest_LDADD = $(LIBOBJS) | |
15 | +socketTest_SOURCES = $(SOURCES) socketTest.c ../src/logger.c ../src/socket.c ../src/socket_listen.c ../src/socket_accept.c ../src/socket_connect.c | |
17 | 16 | socketTest_CFLAGS = -Wall -ggdb -O0 -I ../include -I .. -I . |
18 | 17 | |
19 | -serverTest_SOURCES = runtest.c serverTest.c ../src/cclass.c ../src/logger.c ../src/socket.c ../src/server.c | |
20 | -serverTest_LDADD = $(LIBOBJS) | |
18 | +serverTest_SOURCES = $(SOURCES) serverTest.c ../src/logger.c ../src/socket.c ../src/socket_listen.c ../src/socket_accept.c ../src/server.c | |
21 | 19 | serverTest_CFLAGS = -Wall -ggdb -O0 -I ../include -I .. -I . |
22 | 20 | |
23 | 21 | EXTRA_DIST = runtest.h mock/class.h | ... | ... |
1 | 1 | #include <stdio.h> |
2 | 2 | #include <stdlib.h> |
3 | +#include <unistd.h> | |
3 | 4 | |
4 | 5 | #include "runtest.h" |
5 | 6 | #include "logger.h" |
... | ... | @@ -37,6 +38,7 @@ __setUp() |
37 | 38 | ASSERT_INSTANCE_OF(SOCK, sock); |
38 | 39 | ASSERT_INSTANCE_OF(LOGGER, sock->logger); |
39 | 40 | ASSERT_EQUAL(TEST_PORT, sock->port); |
41 | + ASSERT_NOT_EQUAL(0, sock->handle); | |
40 | 42 | |
41 | 43 | return TEST_OK; |
42 | 44 | } |
... | ... | @@ -69,11 +71,9 @@ int (* const tearDown)() = __tearDown; |
69 | 71 | |
70 | 72 | static |
71 | 73 | int |
72 | -testInitServer() | |
74 | +testListen() | |
73 | 75 | { |
74 | - sock_initServer(sock, 10); | |
75 | - | |
76 | - ASSERT_NOT_NULL(sock->handle); | |
76 | + sock_listen(sock, 10); | |
77 | 77 | |
78 | 78 | return TEST_OK; |
79 | 79 | } |
... | ... | @@ -82,13 +82,42 @@ static |
82 | 82 | int |
83 | 83 | testAccept() |
84 | 84 | { |
85 | - /* | |
86 | - * @TODO ... | |
87 | - */ | |
85 | + SOCK acc, con; | |
86 | + char addr[16]; | |
87 | + pid_t pid; | |
88 | + | |
89 | + sock_listen(sock, 10); | |
90 | + | |
91 | + pid = fork(); | |
92 | + | |
93 | + switch(pid) { | |
94 | + case 0: | |
95 | + con = new(SOCK, logger, TEST_PORT); | |
96 | + sleep(1); | |
97 | + sock_connect(con, "127.0.0.1"); | |
98 | + delete(&con); | |
99 | + __tearDown(); | |
100 | + exit(EXIT_SUCCESS); | |
101 | + break; | |
102 | + | |
103 | + case -1: | |
104 | + return TEST_FAILED; | |
105 | + | |
106 | + default: | |
107 | + acc = sock_accept(sock, addr); | |
108 | + } | |
109 | + | |
110 | + if (NULL != acc) { | |
111 | + ASSERT_OBJECT(acc); | |
112 | + delete(&acc); | |
113 | + } | |
114 | + | |
115 | + return TEST_OK; | |
88 | 116 | } |
89 | 117 | |
90 | 118 | const testfunc tests[] = { |
91 | - testInitServer | |
119 | + testListen, | |
120 | + testAccept | |
92 | 121 | }; |
93 | 122 | const size_t count = FUNCS_COUNT(tests); |
94 | 123 | ... | ... |
Please
register
or
login
to post a comment