author | viric@llimona |
Tue, 30 May 2006 12:34:25 +0200 | |
changeset 57 | de776a4548da |
parent 53 | 667cd5966695 |
child 62 | 39bf7ecd7b21 |
permissions | -rw-r--r-- |
1 | 1 |
#include <unistd.h> // Per les crides a fitxer |
2 |
#include <stdio.h> // Per l'I/O de stdin/stdout |
|
3 |
#include <errno.h> // Pels errors de les crides a fitxer |
|
4 |
#include <string.h> // Per strerror() |
|
5 |
#include <stdlib.h> // Per abort() |
|
6 |
#include <sys/types.h> // Per crides de fitxer |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
7 |
#include <sys/socket.h> // Per les macros bool,true,false |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
8 |
#include <netinet/in.h> |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
9 |
#include <arpa/inet.h> |
16
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
10 |
#include <stdbool.h> |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
11 |
#include <assert.h> // Per assert() |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
12 |
#include <sys/select.h> // Pel select() |
0 | 13 |
|
14 |
#include "rfc3164.h" |
|
26 | 15 |
#include "syslog.h" |
0 | 16 |
|
7 | 17 |
#define LISTEN_QUEUE = 10; |
0 | 18 |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
19 |
void show_help(const char * restrict program) |
0 | 20 |
{ |
30
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
21 |
printf("Usage: %s <udp_port> (negative for enable ipv6)\n", program); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
22 |
} |
1 | 23 |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
24 |
int listen_ipv6(int port) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
25 |
{ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
26 |
int socket_ipv6; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
27 |
struct sockaddr_in6 source_ipv6; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
28 |
int result; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
29 |
int on=1; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
30 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
31 |
|
7 | 32 |
|
30
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
33 |
socket_ipv6 = socket(PF_INET6, SOCK_DGRAM, 0); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
34 |
if (socket_ipv6 == -1) |
1 | 35 |
{ |
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
36 |
fprintf(stderr, "IPv6 socket failed.\n"); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
37 |
abort(); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
38 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
39 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
40 |
/* Fem que poguem reutilitzar l'adreça encara que no s'hagi acabat |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
41 |
el timeout després de tancar-se la connexió */ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
42 |
if (setsockopt(socket_ipv6, SOL_SOCKET, SO_REUSEADDR, |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
43 |
(char *)&on,sizeof(on)) < 0) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
44 |
{ |
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
45 |
fprintf(stderr, "IPv6 setsockopt() failed: %s.\n", |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
46 |
strerror(errno)); |
1 | 47 |
abort(); |
48 |
} |
|
49 |
||
50 |
||
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
51 |
/* IPv6 listen address */ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
52 |
memset(&source_ipv6, 0, sizeof(source_ipv6)); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
53 |
source_ipv6.sin6_family = AF_INET6; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
54 |
source_ipv6.sin6_flowinfo = 0; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
55 |
source_ipv6.sin6_port = htons(port); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
56 |
source_ipv6.sin6_addr = in6addr_any; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
57 |
result = bind(socket_ipv6, (struct sockaddr *) &source_ipv6, |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
58 |
sizeof(source_ipv6)); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
59 |
assert(result == 0); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
60 |
|
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
61 |
/* |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
62 |
result = listen(socket_ipv6, const_listen_queue); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
63 |
if (result != 0) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
64 |
{ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
65 |
printf("Error in listen() ipv6: %s\n", strerror(errno)); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
66 |
abort(); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
67 |
} |
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
68 |
*/ |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
69 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
70 |
return socket_ipv6; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
71 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
72 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
73 |
int listen_ipv4(int port) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
74 |
{ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
75 |
int socket_ipv4; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
76 |
struct sockaddr_in source_ipv4; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
77 |
int result; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
78 |
int on=1; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
79 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
80 |
|
30
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
81 |
socket_ipv4 = socket(PF_INET, SOCK_DGRAM, 0); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
82 |
if (socket_ipv4 == -1) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
83 |
{ |
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
84 |
fprintf(stderr, "IPv4 socket not supported.\n"); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
85 |
abort(); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
86 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
87 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
88 |
/* Fem que poguem reutilitzar l'adreça encara que no s'hagi acabat |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
89 |
el timeout després de tancar-se la connexió */ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
90 |
if (setsockopt(socket_ipv4, SOL_SOCKET, SO_REUSEADDR, |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
91 |
(char *)&on,sizeof(on)) < 0) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
92 |
{ |
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
93 |
fprintf(stderr, "IPv4 setsockopt() failed: %s.\n", |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
94 |
strerror(errno)); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
95 |
abort(); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
96 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
97 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
98 |
/* IPv4 listen address */ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
99 |
memset(&source_ipv4, 0, sizeof(source_ipv4)); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
100 |
source_ipv4.sin_family = AF_INET; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
101 |
source_ipv4.sin_port = htons(port); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
102 |
source_ipv4.sin_addr.s_addr = htonl(INADDR_ANY); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
103 |
result = bind(socket_ipv4, (struct sockaddr *) &source_ipv4, |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
104 |
sizeof(source_ipv4)); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
105 |
assert(result == 0); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
106 |
|
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
107 |
/* |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
108 |
result = listen(socket_ipv4, const_listen_queue); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
109 |
if (result != 0) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
110 |
{ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
111 |
printf("Error in listen() ipv4: %s\n", strerror(errno)); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
112 |
abort(); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
113 |
} |
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
114 |
*/ |
1 | 115 |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
116 |
return socket_ipv4; |
1 | 117 |
} |
118 |
||
30
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
119 |
void server_loop(const int port, const bool ipv6enabled) |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
120 |
{ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
121 |
int socket_ipv6, socket_ipv4; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
122 |
fd_set listen_sockets; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
123 |
struct timeval wait_time; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
124 |
int result; |
53
667cd5966695
Finer message processing - now only at file and screen output appear '\n'.
viric@llimona
parents:
30
diff
changeset
|
125 |
int size; |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
126 |
int high_socket; |
7 | 127 |
char message[MESSAGE_LENGTH+1]; |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
128 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
129 |
|
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
130 |
socket_ipv4 = listen_ipv4(port); |
16
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
131 |
if (ipv6enabled) |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
132 |
socket_ipv6 = listen_ipv6(port); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
133 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
134 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
135 |
/* Mirem quin és el socket més alt pel select() */ |
16
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
136 |
high_socket = socket_ipv4; |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
137 |
if (ipv6enabled && (high_socket < socket_ipv6) ) |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
138 |
high_socket = socket_ipv6; |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
139 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
140 |
high_socket += 1; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
141 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
142 |
result = 0; |
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
143 |
while (result >= 0) |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
144 |
{ |
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
145 |
/* Establim els FDs que volem esperar al select() */ |
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
146 |
FD_ZERO(&listen_sockets); |
16
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
147 |
if (ipv6enabled) |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
148 |
FD_SET(socket_ipv6, &listen_sockets); |
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
149 |
FD_SET(socket_ipv4, &listen_sockets); |
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
150 |
|
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
151 |
/* Establim el temporitzador pel select() */ |
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
152 |
wait_time.tv_sec = 5; |
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
153 |
wait_time.tv_usec = 0; |
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
154 |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
155 |
result = select(high_socket, &listen_sockets, NULL, NULL, |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
156 |
&wait_time); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
157 |
if (result == 0) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
158 |
continue; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
159 |
else if (result == -1) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
160 |
{ |
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
161 |
fprintf(stderr, "Error in select(): %s\n", |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
162 |
strerror(errno)); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
163 |
abort(); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
164 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
165 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
166 |
/* Algun FD té dades... */ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
167 |
if (FD_ISSET(socket_ipv4, &listen_sockets)) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
168 |
{ |
53
667cd5966695
Finer message processing - now only at file and screen output appear '\n'.
viric@llimona
parents:
30
diff
changeset
|
169 |
size = recv(socket_ipv4, message, MESSAGE_LENGTH, 0); |
7 | 170 |
process_message(message); |
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
171 |
/* Debug */ |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
172 |
if(!strcmp(message,"close")) |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
173 |
break; |
53
667cd5966695
Finer message processing - now only at file and screen output appear '\n'.
viric@llimona
parents:
30
diff
changeset
|
174 |
write(1, message, size); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
175 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
176 |
|
16
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
177 |
if (ipv6enabled && FD_ISSET(socket_ipv6, &listen_sockets)) |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
178 |
{ |
53
667cd5966695
Finer message processing - now only at file and screen output appear '\n'.
viric@llimona
parents:
30
diff
changeset
|
179 |
size = recv(socket_ipv6, message, MESSAGE_LENGTH, 0); |
7 | 180 |
process_message(message); |
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
181 |
/* Debug */ |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
182 |
if(!strcmp(message,"close")) |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
183 |
break; |
53
667cd5966695
Finer message processing - now only at file and screen output appear '\n'.
viric@llimona
parents:
30
diff
changeset
|
184 |
write(1, message, size); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
185 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
186 |
} |
16
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
187 |
|
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
188 |
/* Closing sockets at the end */ |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
189 |
close(socket_ipv4); |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
190 |
if (ipv6enabled) |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
191 |
close(socket_ipv6); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
192 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
193 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
194 |
|
0 | 195 |
int main(int argn, char **argv) |
196 |
{ |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
197 |
int port; |
30
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
198 |
bool use_ipv6 = false; |
0 | 199 |
|
200 |
/* Processem els paràmetres d'entrada */ |
|
201 |
if (argn != 2) { |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
202 |
show_help(argv[0]); |
0 | 203 |
return 2; |
204 |
} |
|
205 |
||
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
206 |
port=atoi(argv[1]); |
30
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
207 |
/* If a port number is typed as negative, it will start |
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
208 |
* also the ipv6 server */ |
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
209 |
if(port < 0) |
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
210 |
{ |
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
211 |
port = -port; |
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
212 |
use_ipv6 = true; |
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
213 |
} |
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
214 |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
215 |
if (port < 0 || port >65535) |
1 | 216 |
{ |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
217 |
show_help(argv[0]); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
218 |
return 2; |
0 | 219 |
} |
220 |
||
26 | 221 |
program_ignore_hup(); |
30
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
222 |
|
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
223 |
server_loop(port, use_ipv6); |
1 | 224 |
|
0 | 225 |
return 0; |
226 |
} |