author | viric@llimona |
Thu, 06 Apr 2006 01:47:35 +0200 | |
changeset 18 | 84fa30ea0b0d |
parent 17 | 589406eaaf43 |
child 26 | 7227789ca718 |
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 <netdb.h> // Per protoent getprotobyname |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
12 |
#include <assert.h> // Per assert() |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
13 |
#include <sys/select.h> // Pel select() |
0 | 14 |
|
15 |
#include "rfc3164.h" |
|
16 |
||
7 | 17 |
#define LISTEN_QUEUE = 10; |
0 | 18 |
|
17 | 19 |
const bool ipv6enabled = true; |
16
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
20 |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
21 |
void show_help(const char * restrict program) |
0 | 22 |
{ |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
23 |
printf("Usage: %s <udp_port>\n", program); |
0 | 24 |
} |
25 |
||
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
26 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
27 |
int udp_proto_number() |
1 | 28 |
{ |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
29 |
struct protoent *protocol; |
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 |
/* Get the protocol udp number */ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
32 |
protocol = getprotobyname("udp"); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
33 |
if (protocol == NULL) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
34 |
{ |
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
35 |
fprintf(stderr, "Cannot get the protocol number for udp.\n"); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
36 |
abort(); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
37 |
} |
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 |
return protocol->p_proto; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
40 |
} |
1 | 41 |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
42 |
int listen_ipv6(int port) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
43 |
{ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
44 |
int socket_ipv6; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
45 |
struct sockaddr_in6 source_ipv6; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
46 |
int result; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
47 |
int on=1; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
48 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
49 |
|
7 | 50 |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
51 |
socket_ipv6 = socket(PF_INET6, SOCK_DGRAM, udp_proto_number() ); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
52 |
if (socket_ipv6 == -1) |
1 | 53 |
{ |
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
54 |
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
|
55 |
abort(); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
56 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
57 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
58 |
/* 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
|
59 |
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
|
60 |
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
|
61 |
(char *)&on,sizeof(on)) < 0) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
62 |
{ |
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
63 |
fprintf(stderr, "IPv6 setsockopt() failed: %s.\n", |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
64 |
strerror(errno)); |
1 | 65 |
abort(); |
66 |
} |
|
67 |
||
68 |
||
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
69 |
/* IPv6 listen address */ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
70 |
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
|
71 |
source_ipv6.sin6_family = AF_INET6; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
72 |
source_ipv6.sin6_flowinfo = 0; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
73 |
source_ipv6.sin6_port = htons(port); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
74 |
source_ipv6.sin6_addr = in6addr_any; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
75 |
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
|
76 |
sizeof(source_ipv6)); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
77 |
assert(result == 0); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
78 |
|
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
79 |
/* |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
80 |
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
|
81 |
if (result != 0) |
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 |
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
|
84 |
abort(); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
85 |
} |
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
86 |
*/ |
3
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 |
return socket_ipv6; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
89 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
90 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
91 |
int listen_ipv4(int port) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
92 |
{ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
93 |
int socket_ipv4; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
94 |
struct sockaddr_in source_ipv4; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
95 |
int result; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
96 |
int on=1; |
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 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
99 |
socket_ipv4 = socket(PF_INET, SOCK_DGRAM, udp_proto_number() ); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
100 |
if (socket_ipv4 == -1) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
101 |
{ |
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
102 |
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
|
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 |
/* 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
|
107 |
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
|
108 |
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
|
109 |
(char *)&on,sizeof(on)) < 0) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
110 |
{ |
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
111 |
fprintf(stderr, "IPv4 setsockopt() failed: %s.\n", |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
112 |
strerror(errno)); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
113 |
abort(); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
114 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
115 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
116 |
/* IPv4 listen address */ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
117 |
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
|
118 |
source_ipv4.sin_family = AF_INET; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
119 |
source_ipv4.sin_port = htons(port); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
120 |
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
|
121 |
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
|
122 |
sizeof(source_ipv4)); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
123 |
assert(result == 0); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
124 |
|
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
125 |
/* |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
126 |
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
|
127 |
if (result != 0) |
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 |
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
|
130 |
abort(); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
131 |
} |
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
132 |
*/ |
1 | 133 |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
134 |
return socket_ipv4; |
1 | 135 |
} |
136 |
||
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
137 |
void server_loop(int port) |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
138 |
{ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
139 |
int socket_ipv6, socket_ipv4; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
140 |
fd_set listen_sockets; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
141 |
struct timeval wait_time; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
142 |
int result; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
143 |
int high_socket; |
7 | 144 |
char message[MESSAGE_LENGTH+1]; |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
145 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
146 |
|
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
147 |
socket_ipv4 = listen_ipv4(port); |
16
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
148 |
if (ipv6enabled) |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
149 |
socket_ipv6 = listen_ipv6(port); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
150 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
151 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
152 |
/* 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
|
153 |
high_socket = socket_ipv4; |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
154 |
if (ipv6enabled && (high_socket < socket_ipv6) ) |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
155 |
high_socket = socket_ipv6; |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
156 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
157 |
high_socket += 1; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
158 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
159 |
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
|
160 |
while (result >= 0) |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
161 |
{ |
4
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
162 |
/* 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
|
163 |
FD_ZERO(&listen_sockets); |
16
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
164 |
if (ipv6enabled) |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
165 |
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
|
166 |
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
|
167 |
|
f74ca12a5a41
El 'listen' no es pot fer amb UDP. Ara ja va el select i tot.
viric@llimona
parents:
3
diff
changeset
|
168 |
/* 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
|
169 |
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
|
170 |
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
|
171 |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
172 |
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
|
173 |
&wait_time); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
174 |
if (result == 0) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
175 |
continue; |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
176 |
else if (result == -1) |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
177 |
{ |
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
178 |
fprintf(stderr, "Error in select(): %s\n", |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
179 |
strerror(errno)); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
180 |
abort(); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
181 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
182 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
183 |
/* Algun FD té dades... */ |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
184 |
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
|
185 |
{ |
7 | 186 |
recv(socket_ipv4, message, MESSAGE_LENGTH, 0); |
187 |
process_message(message); |
|
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
188 |
/* Debug */ |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
189 |
if(!strcmp(message,"close")) |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
190 |
break; |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
191 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
192 |
|
16
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
193 |
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
|
194 |
{ |
7 | 195 |
recv(socket_ipv6, message, MESSAGE_LENGTH, 0); |
196 |
process_message(message); |
|
15
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
197 |
/* Debug */ |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
198 |
if(!strcmp(message,"close")) |
fea6e87812f0
Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
10
diff
changeset
|
199 |
break; |
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 |
} |
16
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
202 |
|
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
203 |
/* Closing sockets at the end */ |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
204 |
close(socket_ipv4); |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
205 |
if (ipv6enabled) |
de00e98450eb
Versió 1 quasi per entregar. Falta molt RFC per implementar.
viric@llimona
parents:
15
diff
changeset
|
206 |
close(socket_ipv6); |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
207 |
} |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
208 |
|
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
209 |
|
0 | 210 |
int main(int argn, char **argv) |
211 |
{ |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
212 |
int port; |
0 | 213 |
|
214 |
/* Processem els paràmetres d'entrada */ |
|
215 |
if (argn != 2) { |
|
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
216 |
show_help(argv[0]); |
0 | 217 |
return 2; |
218 |
} |
|
219 |
||
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
220 |
port=atoi(argv[1]); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
221 |
if (port < 0 || port >65535) |
1 | 222 |
{ |
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
223 |
show_help(argv[0]); |
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
224 |
return 2; |
0 | 225 |
} |
226 |
||
3
9bcdce466e88
Crec que hauria de funcionar almenys el listen... però no va.
viric@llimona
parents:
2
diff
changeset
|
227 |
server_loop(port); |
1 | 228 |
|
0 | 229 |
return 0; |
230 |
} |