Implémentation de poll() terminé, ajouter les nouvelles fonctions et
leurs signtaure à faire
This commit is contained in:
parent
eefea551f7
commit
db3875205e
203
src/node.c
203
src/node.c
@ -7,6 +7,11 @@
|
||||
#include <netinet/in.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <fcntl.h>
|
||||
#include <poll.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "node.h"
|
||||
#include "tlv.h"
|
||||
@ -551,35 +556,191 @@ void listen_for_packets(){
|
||||
}
|
||||
}
|
||||
|
||||
int run_node(int sock_fd, struct sockaddr_in6 * peer){
|
||||
printf(">> Boostrapping node...\n");
|
||||
|
||||
int ret;
|
||||
ssize_t bytes;
|
||||
char input_buffer[1024];
|
||||
char output_buffer[1024];
|
||||
struct pollfd fds[2];
|
||||
|
||||
/* Descriptor zero is stdin */
|
||||
fds[0].fd = 0;
|
||||
fds[1].fd = sock_fd;
|
||||
fds[0].events = POLLIN | POLLPRI;
|
||||
fds[1].events = POLLIN | POLLPRI;
|
||||
|
||||
/* Normally we'd check an exit condition, but for this example
|
||||
* we loop endlessly.
|
||||
*/
|
||||
while (1) {
|
||||
/* Call poll() */
|
||||
ret = poll(fds, 2, -1);
|
||||
|
||||
if (ret < 0) {
|
||||
printf("Error - poll returned error: %s\n", strerror(errno));
|
||||
break;
|
||||
}
|
||||
if (ret > 0) {
|
||||
|
||||
/* Regardless of requested events, poll() can always return these */
|
||||
if (fds[0].revents & (POLLERR | POLLHUP | POLLNVAL)) {
|
||||
printf("Error - poll indicated stdin error\n");
|
||||
break;
|
||||
}
|
||||
if (fds[1].revents & (POLLERR | POLLHUP | POLLNVAL)) {
|
||||
printf("Error - poll indicated socket error\n");
|
||||
break;
|
||||
}
|
||||
|
||||
/* Check if data to read from stdin */
|
||||
printf(">> ");
|
||||
if (fds[0].revents & (POLLIN | POLLPRI)) {
|
||||
bytes = read(0, output_buffer, sizeof(output_buffer));
|
||||
if (bytes < 0) {
|
||||
printf("Error - stdin error: %s\n", strerror(errno));
|
||||
break;
|
||||
}
|
||||
|
||||
// // Reset buffer
|
||||
// // memset(&output_buffer, '\0', 1024);
|
||||
//
|
||||
// // Build packet
|
||||
// struct packet message;
|
||||
// message.magic = 95;
|
||||
// message.version = 1;
|
||||
// message.body = malloc(20);
|
||||
//
|
||||
// // Build TLV
|
||||
// struct neighbour_req *neigh_req = (neighbour_req*) malloc(sizeof(neighbour_req));
|
||||
//
|
||||
// neigh_req->type = 2;
|
||||
// neigh_req->length = 0;
|
||||
//
|
||||
// message.length = 2 * sizeof(unsigned char);
|
||||
// printf("(%i)\n", message.length );
|
||||
// // message.body = (char *) neigh_req;
|
||||
//
|
||||
// memcpy(message.body, &neigh_req, sizeof(struct neighbour_req));
|
||||
// memcpy(&output_buffer, &message, sizeof(struct packet));
|
||||
|
||||
struct iovec vec_buff_reply = {.iov_len = sizeof(output_buffer), .iov_base = output_buffer};
|
||||
|
||||
struct sockaddr_in6 ntp_server_adress;
|
||||
memset(&ntp_server_adress, 0, sizeof(ntp_server_adress));
|
||||
|
||||
int inet_p = inet_pton(AF_INET6, "2a00:1080:800::6:1", &ntp_server_adress.sin6_addr);
|
||||
if(inet_p < 1){
|
||||
perror(">> Failed inet_pton.");
|
||||
exit(1);
|
||||
}
|
||||
ntp_server_adress.sin6_family = AF_INET6;
|
||||
ntp_server_adress.sin6_port = htons(1212); // NTP port number.
|
||||
|
||||
const struct msghdr reply = {
|
||||
.msg_name = &ntp_server_adress,
|
||||
.msg_namelen = sizeof(ntp_server_adress),
|
||||
.msg_iov = &vec_buff_reply,
|
||||
.msg_iovlen = 1
|
||||
};
|
||||
|
||||
printf("Sending: %li bytes as : %s\n", sizeof(output_buffer), output_buffer);
|
||||
// bytes = sendto(sock_fd, output_buffer, sizeof(output_buffer), 0, (struct sockaddr *)peer, sizeof(struct sockaddr_in));
|
||||
bytes = sendmsg((int) sock_fd, &reply, 0);
|
||||
if (bytes < 0) {
|
||||
perror("deded");
|
||||
printf("Error - sendto error: %s\n", strerror(errno));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if data to read from socket */
|
||||
if (fds[1].revents & (POLLIN | POLLPRI)) {
|
||||
bytes = recvfrom(sock_fd, input_buffer, sizeof(input_buffer),
|
||||
0, NULL, NULL);
|
||||
if (bytes < 0) {
|
||||
printf("Error - recvfrom error: %s\n", strerror(errno));
|
||||
break;
|
||||
}
|
||||
if (bytes > 0) {
|
||||
printf("Received: %.*s\r", (int)bytes, input_buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, const char *argv[]) {
|
||||
printf(">> Starting node\n");
|
||||
int cont = 1;
|
||||
|
||||
while(cont){
|
||||
unsigned long local_port = 1212;
|
||||
unsigned long remote_port = 1212;
|
||||
|
||||
// We create the neighbourhood table
|
||||
// neighbour_peer neighbour_list[NEIGHBOUR_MAX];
|
||||
// We create the message table
|
||||
int sock_fd;
|
||||
|
||||
// We create our own message.
|
||||
struct sockaddr_in6 server_addr;
|
||||
struct sockaddr_in6 peer_addr;
|
||||
|
||||
// Listen for incoming packets
|
||||
listen_for_packets();
|
||||
memset(&peer_addr, 0, sizeof(peer_addr));
|
||||
|
||||
// This is in it's own fork.
|
||||
time_t delay = time(NULL) + 20;
|
||||
while(! (delay < time(NULL))) {
|
||||
// Theses functions are there for general book-keeping,and run in there own
|
||||
// thread, being run every 20 seconds.
|
||||
// Every 20 sec, if we have less than 5 neighbours, we ask for more peers
|
||||
// by sending out a TLV neighbour Request at a random peer.
|
||||
t_ask_for_more_peers();
|
||||
// Every 20 sec, we also check for a peer that didn't emit a new message for
|
||||
// the past 70 sec, if he's temporary, we delete him from the neighbourhood.
|
||||
t_update_neighbours();
|
||||
// We send out a TLV Network hash to get an ideal of the network state.
|
||||
t_get_network_state();
|
||||
}
|
||||
peer_addr.sin6_family = AF_INET6;
|
||||
peer_addr.sin6_port = htons(remote_port);
|
||||
if (inet_pton(AF_INET6, "2001:660:3301:9200::51c2:1b9b", &peer_addr.sin6_addr) < 0) {
|
||||
printf("Error - invalid remote address '%s'\n", "2001:660:3301:9200::51c2:1b9b");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Create UDP socket */
|
||||
sock_fd = socket(AF_INET6, SOCK_DGRAM, 0);
|
||||
if (sock_fd < 0) {
|
||||
printf("Error - failed to open socket: %s\n", strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Bind socket */
|
||||
memset(&server_addr, 0, sizeof(server_addr));
|
||||
server_addr.sin6_family = AF_INET6;
|
||||
// server_addr.sin6_addr.in6_addr = htonl(INADDR_ANY);
|
||||
server_addr.sin6_port = htons(local_port);
|
||||
if (bind(sock_fd, (struct sockaddr *)(&server_addr), sizeof(server_addr)) < 0) {
|
||||
printf("Error - failed to bind socket: %s\n", strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
|
||||
run_node(sock_fd, &peer_addr);
|
||||
|
||||
|
||||
close(sock_fd);
|
||||
//
|
||||
// while(cont){
|
||||
//
|
||||
// // We create the neighbourhood table
|
||||
// // neighbour_peer neighbour_list[NEIGHBOUR_MAX];
|
||||
// // We create the message table
|
||||
//
|
||||
// // We create our own message.
|
||||
//
|
||||
// // Listen for incoming packets
|
||||
// // listen_for_packets();
|
||||
// //
|
||||
// // // This is in it's own fork.
|
||||
// // time_t delay = time(NULL) + 20;
|
||||
// // while(! (delay < time(NULL))) {
|
||||
// // // Theses functions are there for general book-keeping,and run in there own
|
||||
// // // thread, being run every 20 seconds.
|
||||
// // // Every 20 sec, if we have less than 5 neighbours, we ask for more peers
|
||||
// // // by sending out a TLV neighbour Request at a random peer.
|
||||
// // t_ask_for_more_peers();
|
||||
// // // Every 20 sec, we also check for a peer that didn't emit a new message for
|
||||
// // // the past 70 sec, if he's temporary, we delete him from the neighbourhood.
|
||||
// // t_update_neighbours();
|
||||
// // // We send out a TLV Network hash to get an ideal of the network state.
|
||||
// // t_get_network_state();
|
||||
// }
|
||||
// }
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user