diff --git a/main.c b/main.c index 6f66bb8..e1f5be1 100644 --- a/main.c +++ b/main.c @@ -223,6 +223,8 @@ int initialize_everything(char* lua_file) { deinitialize_everything(); return 0; } + // initialize the address book + oct_network_ab_init(); } if (config.needs_termbox) { @@ -236,6 +238,8 @@ int deinitialize_everything() { tb_shutdown(); if (L) lua_close(L); oct_tb_sprite_list_deinitialize(); + oct_network_ab_deinit(); + //oct_network_node_deinit(); oct_log_deinit(); return 1; } diff --git a/oct_networking.c b/oct_networking.c index a1243cf..1ee94cb 100644 --- a/oct_networking.c +++ b/oct_networking.c @@ -141,6 +141,7 @@ int oct_network_recv_msg() { // recvfrom returns -1 if nothing was received // Need MSG_DONTWAIT flag for nonblocking if (recvfrom(oct_network_node.sfd, oct_network_node.recv_buffer, BUFFER_SIZE, MSG_DONTWAIT, (struct sockaddr *) &peer_addr, &peer_addrlen) > 0) { + OCT_LOG_INFO("Received message!"); int s = getnameinfo((struct sockaddr *) &peer_addr, peer_addrlen, oct_network_node.recv_addr, NI_MAXHOST, oct_network_node.recv_port, NI_MAXSERV, NI_NUMERICSERV); if (s != 0) { @@ -156,14 +157,29 @@ int oct_network_recv_msg() { int oct_network_send_msg() { if (oct_network_node.needs_send) { - int sfd = oct_network_init_socket(oct_network_node.send_addr, oct_network_node.send_port); + struct oct_network_ab_entry* e; + e = oct_network_ab_find(oct_network_node.send_addr, oct_network_node.send_port); + if (!e) { + OCT_LOG_INFO("Not in address book: %s:%s", oct_network_node.send_addr, oct_network_node.send_port); + e = oct_network_ab_insert(oct_network_node.send_addr, oct_network_node.send_port); + if (!e) { + // Give up... + oct_network_node.needs_send = 0; + return 0; + } + } + else { + OCT_LOG_INFO("Found in address book: %s:%s", oct_network_node.send_addr, oct_network_node.send_port); + } + int sfd = e->sfd; + ssize_t length = strlen(oct_network_node.send_buffer); + OCT_LOG_INFO("Sending message"); if (write(sfd, oct_network_node.send_buffer, length) != length) { OCT_LOG_WARNING("Partial write when sending message"); return -1; } oct_network_node.needs_send = 0; - close(sfd); } return 1; } @@ -198,7 +214,7 @@ void oct_network_ab_init() { oct_network_ab.last = NULL; } -int oct_network_ab_insert(char* addr, char* port) { +struct oct_network_ab_entry* oct_network_ab_insert(char* addr, char* port) { // First create the entry struct oct_network_ab_entry* e = (struct oct_network_ab_entry*)malloc(sizeof(struct oct_network_ab_entry)); if (!e) { @@ -208,8 +224,9 @@ int oct_network_ab_insert(char* addr, char* port) { // Then, create the socket if ((e->sfd = oct_network_init_socket(addr, port)) < 0) { free(e); - return 0; + return NULL; } + OCT_LOG_INFO("CREATED NEW SOCKET"); e->next = NULL; e->prev = oct_network_ab.last; strncpy(e->addr, addr, NI_MAXHOST); @@ -223,14 +240,16 @@ int oct_network_ab_insert(char* addr, char* port) { oct_network_ab.last = e; oct_network_ab.size++; - return 1; + return e; } int oct_network_ab_remove(struct oct_network_ab_entry* e) { // First, remove node from linked list and fix if (e == oct_network_ab.first) { oct_network_ab.first = e->next; - e->next->prev = NULL; + if (e->next) { + e->next->prev = NULL; + } } else if (e == oct_network_ab.last) { oct_network_ab.last = e->prev; @@ -248,6 +267,18 @@ int oct_network_ab_remove(struct oct_network_ab_entry* e) { return 1; } +struct oct_network_ab_entry* oct_network_ab_find(char* addr, char* port) { + struct oct_network_ab_entry* crawler = oct_network_ab.first; + while (crawler != NULL) { + if (strncmp(crawler->addr, addr, NI_MAXHOST) == 0 && + strncmp(crawler->port, port, NI_MAXSERV) == 0) { + return crawler; + } + crawler = crawler->next; + } + return NULL; +} + void oct_network_ab_deinit() { while (oct_network_ab.first) { oct_network_ab_remove(oct_network_ab.first); diff --git a/oct_networking.h b/oct_networking.h index d21677c..272f93d 100644 --- a/oct_networking.h +++ b/oct_networking.h @@ -30,8 +30,9 @@ int oct_network_recv_msg_lua(lua_State* L); int oct_network_send_msg_lua(lua_State* L); void oct_network_ab_init(); -int oct_network_ab_insert(char* addr, char* port); +struct oct_network_ab_entry* oct_network_ab_insert(char* addr, char* port); int oct_network_ab_remove(struct oct_network_ab_entry* e); +struct oct_network_ab_entry* oct_network_ab_find(char* addr, char* port); void oct_network_ab_deinit();