author | viric@llimona |
Fri, 16 Jun 2006 18:45:24 +0200 | |
changeset 62 | 39bf7ecd7b21 |
parent 53 | 667cd5966695 |
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 |
} |
|
62
39bf7ecd7b21
IPV6_V6ONLY setsockopt added for the udp server.
viric@llimona
parents:
53
diff
changeset
|
49 |
|
39bf7ecd7b21
IPV6_V6ONLY setsockopt added for the udp server.
viric@llimona
parents:
53
diff
changeset
|
50 |
/* Es necessita per a que linux no fagi Bind del port IPv4 alhora */ |
39bf7ecd7b21
IPV6_V6ONLY setsockopt added for the udp server.
viric@llimona
parents:
53
diff
changeset
|
51 |
if (setsockopt(socket_ipv6, IPPROTO_IPV6, IPV6_V6ONLY, |
39bf7ecd7b21
IPV6_V6ONLY setsockopt added for the udp server.
viric@llimona
parents:
53
diff
changeset
|
52 |
(char *)&on,sizeof(on)) < 0) |
39bf7ecd7b21
IPV6_V6ONLY setsockopt added for the udp server.
viric@llimona
parents:
53
diff
changeset
|
53 |
{ |
39bf7ecd7b21
IPV6_V6ONLY setsockopt added for the udp server.
viric@llimona
parents:
53
diff
changeset
|
54 |
fprintf(stderr, "IPv6 setsockopt() failed for IPV6_V6ONLY: %s.\n", |
39bf7ecd7b21
IPV6_V6ONLY setsockopt added for the udp server.
viric@llimona
parents:
53
diff
changeset
|
55 |
strerror(errno)); |
39bf7ecd7b21
IPV6_V6ONLY setsockopt added for the udp server.
viric@llimona
parents:
53
diff
changeset
|
56 |
abort(); |
39bf7ecd7b21
IPV6_V6ONLY setsockopt added for the udp server.
viric@llimona
parents:
53
diff
changeset
|
57 |
} |
1 | 58 |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
59 |
/* IPv6 listen address */ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
60 |
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
|
61 |
source_ipv6.sin6_family = AF_INET6; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
62 |
source_ipv6.sin6_flowinfo = 0; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
63 |
source_ipv6.sin6_port = htons(port); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
64 |
source_ipv6.sin6_addr = in6addr_any; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
65 |
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
|
66 |
sizeof(source_ipv6)); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
67 |
assert(result == 0); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
68 |
|
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
69 |
/* |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
70 |
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
|
71 |
if (result != 0) |
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 |
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
|
74 |
abort(); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
75 |
} |
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
76 |
*/ |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
77 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
78 |
return socket_ipv6; |
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 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
81 |
int listen_ipv4(int port) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
82 |
{ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
83 |
int socket_ipv4; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
84 |
struct sockaddr_in source_ipv4; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
85 |
int result; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
86 |
int on=1; |
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 |
|
30
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
89 |
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
|
90 |
if (socket_ipv4 == -1) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
91 |
{ |
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
92 |
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
|
93 |
abort(); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
94 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
95 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
96 |
/* 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
|
97 |
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
|
98 |
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
|
99 |
(char *)&on,sizeof(on)) < 0) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
100 |
{ |
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
101 |
fprintf(stderr, "IPv4 setsockopt() failed: %s.\n", |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
102 |
strerror(errno)); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
103 |
abort(); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
104 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
105 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
106 |
/* IPv4 listen address */ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
107 |
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
|
108 |
source_ipv4.sin_family = AF_INET; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
109 |
source_ipv4.sin_port = htons(port); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
110 |
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
|
111 |
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
|
112 |
sizeof(source_ipv4)); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
113 |
assert(result == 0); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
114 |
|
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
115 |
/* |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
116 |
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
|
117 |
if (result != 0) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
118 |
{ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
119 |
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
|
120 |
abort(); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
121 |
} |
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
122 |
*/ |
1 | 123 |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
124 |
return socket_ipv4; |
1 | 125 |
} |
126 |
||
30
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
127 |
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
|
128 |
{ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
129 |
int socket_ipv6, socket_ipv4; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
130 |
fd_set listen_sockets; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
131 |
struct timeval wait_time; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
132 |
int result; |
53
667cd5966695
Finer message processing - now only at file and screen output appear '\n'.
viric@llimona
parents:
30
diff
changeset
|
133 |
int size; |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
134 |
int high_socket; |
7 | 135 |
char message[MESSAGE_LENGTH+1]; |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
136 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
137 |
|
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
138 |
socket_ipv4 = listen_ipv4(port); |
16
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
139 |
if (ipv6enabled) |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
140 |
socket_ipv6 = listen_ipv6(port); |
3
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 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
143 |
/* 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
|
144 |
high_socket = socket_ipv4; |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
145 |
if (ipv6enabled && (high_socket < socket_ipv6) ) |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
146 |
high_socket = socket_ipv6; |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
147 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
148 |
high_socket += 1; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
149 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
150 |
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
|
151 |
while (result >= 0) |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
152 |
{ |
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
153 |
/* 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
|
154 |
FD_ZERO(&listen_sockets); |
16
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
155 |
if (ipv6enabled) |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
156 |
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
|
157 |
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
|
158 |
|
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
159 |
/* 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
|
160 |
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
|
161 |
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
|
162 |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
163 |
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
|
164 |
&wait_time); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
165 |
if (result == 0) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
166 |
continue; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
167 |
else if (result == -1) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
168 |
{ |
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
169 |
fprintf(stderr, "Error in select(): %s\n", |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
170 |
strerror(errno)); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
171 |
abort(); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
172 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
173 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
174 |
/* Algun FD té dades... */ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
175 |
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
|
176 |
{ |
53
667cd5966695
Finer message processing - now only at file and screen output appear '\n'.
viric@llimona
parents:
30
diff
changeset
|
177 |
size = recv(socket_ipv4, message, MESSAGE_LENGTH, 0); |
7 | 178 |
process_message(message); |
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
179 |
/* Debug */ |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
180 |
if(!strcmp(message,"close")) |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
181 |
break; |
53
667cd5966695
Finer message processing - now only at file and screen output appear '\n'.
viric@llimona
parents:
30
diff
changeset
|
182 |
write(1, message, size); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
183 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
184 |
|
16
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
185 |
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
|
186 |
{ |
53
667cd5966695
Finer message processing - now only at file and screen output appear '\n'.
viric@llimona
parents:
30
diff
changeset
|
187 |
size = recv(socket_ipv6, message, MESSAGE_LENGTH, 0); |
7 | 188 |
process_message(message); |
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
189 |
/* Debug */ |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
190 |
if(!strcmp(message,"close")) |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
191 |
break; |
53
667cd5966695
Finer message processing - now only at file and screen output appear '\n'.
viric@llimona
parents:
30
diff
changeset
|
192 |
write(1, message, size); |
3
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 |
} |
16
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
195 |
|
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
196 |
/* Closing sockets at the end */ |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
197 |
close(socket_ipv4); |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
198 |
if (ipv6enabled) |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
199 |
close(socket_ipv6); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
200 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
201 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
202 |
|
0 | 203 |
int main(int argn, char **argv) |
204 |
{ |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
205 |
int port; |
30
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
206 |
bool use_ipv6 = false; |
0 | 207 |
|
208 |
/* Processem els paràmetres d'entrada */ |
|
209 |
if (argn != 2) { |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
210 |
show_help(argv[0]); |
0 | 211 |
return 2; |
212 |
} |
|
213 |
||
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
214 |
port=atoi(argv[1]); |
30
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
215 |
/* 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
|
216 |
* also the ipv6 server */ |
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
217 |
if(port < 0) |
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
218 |
{ |
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
219 |
port = -port; |
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
220 |
use_ipv6 = true; |
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
221 |
} |
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
222 |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
223 |
if (port < 0 || port >65535) |
1 | 224 |
{ |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
225 |
show_help(argv[0]); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
226 |
return 2; |
0 | 227 |
} |
228 |
||
26 | 229 |
program_ignore_hup(); |
30
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
230 |
|
eacb6e51eb0a
Added ipv6-option as run parameter. Removed a dependency of shared glibc,
viric@mandarina
parents:
26
diff
changeset
|
231 |
server_loop(port, use_ipv6); |
1 | 232 |
|
0 | 233 |
return 0; |
234 |
} |