summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorme_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac>2013-05-26 10:41:26 +0000
committerme_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac>2013-05-26 10:41:26 +0000
commit8abc4a1c834c438b6c61a8b5a68bee77f41124a9 (patch)
tree667a6696ca41c9c44a458b289b0a0dda761a3700
parent2c9c6984f86ff999b6b08acb7d2c2d350d3b37dd (diff)
downloadpica-pica-8abc4a1c834c438b6c61a8b5a68bee77f41124a9.tar.gz
pica-pica-8abc4a1c834c438b6c61a8b5a68bee77f41124a9.zip
disconnect nodelink if more than one connection to the same node is detected
git-svn-id: svn://localhost/project_picapica/trunk@246 fb96df88-216d-11de-830c-f3023f12d8ac
-rwxr-xr-xPICA_node.c29
-rwxr-xr-xPICA_nodeaddrlist.c6
-rwxr-xr-xPICA_nodeaddrlist.h6
3 files changed, 34 insertions, 7 deletions
diff --git a/PICA_node.c b/PICA_node.c
index 9bda5cb..aec9519 100755
--- a/PICA_node.c
+++ b/PICA_node.c
@@ -108,11 +108,13 @@ int nodelink_rbuf_grow(struct nodelink *nl);
int nodelink_attach_nodeaddr(struct nodelink *nl, unsigned int addr_type, void* nodeaddr, unsigned int nodeaddr_size);
struct nodelink *nodelink_list_addnew(struct newconn *nc);
void nodelink_list_delete(struct nodelink *n);
+struct nodelink *nodelink_search_by_ipv4addr(in_addr_t addr, in_port_t port); /* arguments are in network byte order */
void newconn_close(struct newconn* nc);
void newconn_free(struct newconn* nc);
struct newconn* newconn_add(struct newconn *ncs,int *pos);
+void PICA_node_joinskynet(const char* addrlistfilename, const char *my_addr);
//описание формата сообщений, которые могут приходить _ОТ_ клиентов по управляющему защищенному соединению
#define MSGINFO_MSGSNUM(arr) (sizeof(arr)/sizeof(struct PICA_msginfo))
@@ -590,6 +592,11 @@ switch (buf[0])
na_ipv4.addr=*(in_addr_t*)(buf+2);
na_ipv4.port=*(in_port_t*)(buf+6);
+ if (nodelink_search_by_ipv4addr(na_ipv4.addr, na_ipv4.port)) //connection with this node is already established
+ {
+ return 0;
+ }
+
sprintf(na.addr,"%.16s",inet_ntoa(*(struct in_addr*)&na_ipv4.addr));
na.port = ntohs(na_ipv4.port);
@@ -1781,6 +1788,26 @@ nl->w_pos+=size;
return mp;
}
+struct nodelink *nodelink_search_by_ipv4addr(in_addr_t ip, in_port_t port)
+{
+struct nodelink *nl;
+
+nl = nodelink_list_head;
+
+while(nl && !(
+ (nl->addr.sin_addr.s_addr == ip && nl->addr.sin_port == port) ||
+ (nl->node_addr && nl->addr_type == PICA_PROTO_NEWNODE_IPV4 &&
+ ((struct PICA_nodeaddr_ipv4*)nl->node_addr) ->addr == ip &&
+ ((struct PICA_nodeaddr_ipv4*)nl->node_addr) ->port == port
+ )
+ )
+ )
+ {
+ nl = nl->next;
+ }
+
+return nl;
+}
// обработка различных таймаутов. Отправка пингов
@@ -2739,7 +2766,7 @@ if (verbosity > 3)
PICA_set_loglevel(PICA_LOG_INFO + verbosity);
}
-void PICA_node_joinskynet(char* addrlistfilename, const char *my_addr)
+void PICA_node_joinskynet(const char* addrlistfilename, const char *my_addr)
{
struct PICA_nodeaddr *nap,*addrlist_h=0;
struct nodelink *nl;
diff --git a/PICA_nodeaddrlist.c b/PICA_nodeaddrlist.c
index 7d9e8f6..df91230 100755
--- a/PICA_nodeaddrlist.c
+++ b/PICA_nodeaddrlist.c
@@ -44,7 +44,7 @@ na->next = *(cp->n_addr);
return 0;
}
-int PICA_nodeaddr_list_load(char* dbfilename,struct PICA_nodeaddr **list_head)
+int PICA_nodeaddr_list_load(const char* dbfilename,struct PICA_nodeaddr **list_head)
{
int N=0, ret;
sqlite3 *db;
@@ -74,7 +74,7 @@ sqlite3_close(db);
return N;
}
-int PICA_nodeaddr_update(char* dbfilename, struct PICA_nodeaddr *naddr, int is_alive)
+int PICA_nodeaddr_update(const char* dbfilename, struct PICA_nodeaddr *naddr, int is_alive)
{
sqlite3 *db;
sqlite3_stmt *stmt;
@@ -139,7 +139,7 @@ sqlite3_close(db);
return 1;
}
-int PICA_nodeaddr_save(char* dbfilename, struct PICA_nodeaddr *naddr)
+int PICA_nodeaddr_save(const char* dbfilename, struct PICA_nodeaddr *naddr)
{
sqlite3 *db;
sqlite3_stmt *stmt;
diff --git a/PICA_nodeaddrlist.h b/PICA_nodeaddrlist.h
index 1b514e6..6f57bed 100755
--- a/PICA_nodeaddrlist.h
+++ b/PICA_nodeaddrlist.h
@@ -42,9 +42,9 @@ in_port_t port;//номер порта - host byte order
struct PICA_nodeaddr *next;
};
-int PICA_nodeaddr_list_load(char* dbfilename,struct PICA_nodeaddr **list_head);
-int PICA_nodeaddr_save(char* dbfilename, struct PICA_nodeaddr *naddr);
-int PICA_nodeaddr_update(char* dbfilename, struct PICA_nodeaddr *naddr, int is_alive);
+int PICA_nodeaddr_list_load(const char* dbfilename,struct PICA_nodeaddr **list_head);
+int PICA_nodeaddr_save(const char* dbfilename, struct PICA_nodeaddr *naddr);
+int PICA_nodeaddr_update(const char* dbfilename, struct PICA_nodeaddr *naddr, int is_alive);
int PICA_nodeaddr_list_add();//
int PICA_nodeaddr_list_remove();//
void PICA_nodeaddr_list_free(struct PICA_nodeaddr *list_head);