diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index b2fec4bbf..505ae8a33 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -119,6 +119,8 @@ char *LP_register(bits256 pubkey,char *ipaddr,uint16_t port) if ( strcmp(pushaddr,ptr->pushaddr) != 0 ) { nn_close(ptr->pushsock); + if ( LP_psockmark(ptr->pushaddr) < 0 ) + printf("cant mark (%s)\n",ptr->pushaddr); printf("recreate pushsock for %s\n",pushaddr); strcpy(ptr->pushaddr,pushaddr); if ( (ptr->pushsock= LP_pushsock_create(ptr,pushaddr)) < 0 ) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 9fd93d54e..71cc904f8 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -24,7 +24,7 @@ struct psock uint32_t lasttime,lastping; int32_t recvsock,sendsock,ispaired; uint16_t recvport,sendport; - char sendaddr[128]; + char sendaddr[128],publicaddr[128]; } *PSOCKS; uint16_t Numpsocks,Psockport = 10000; @@ -113,7 +113,6 @@ void LP_psockloop(void *_ptr) { if ( (sentbytes= nn_send(sendsock,buf,size,0)) > 0 ) { - ptr->lasttime = now; printf("PSOCKS (%d %d %d) -> %d/%d bytes %s\n",ptr->recvsock,ptr->sendsock,sendsock,size,sentbytes,ptr->sendaddr); } else printf("send error to %s\n",ptr->sendaddr); if ( buf != 0 ) @@ -251,7 +250,7 @@ void LP_psockloop(void *_ptr) } } -void LP_psockadd(int32_t ispaired,int32_t recvsock,uint16_t recvport,int32_t sendsock,uint16_t sendport,char *subaddr) +void LP_psockadd(int32_t ispaired,int32_t recvsock,uint16_t recvport,int32_t sendsock,uint16_t sendport,char *subaddr,char *publicaddr) { struct psock *ptr; portable_mutex_lock(&LP_psockmutex); @@ -263,10 +262,30 @@ void LP_psockadd(int32_t ispaired,int32_t recvsock,uint16_t recvport,int32_t sen ptr->sendsock = sendsock; ptr->sendport = sendport; safecopy(ptr->sendaddr,subaddr,sizeof(ptr->sendaddr)); + safecopy(ptr->publicaddr,publicaddr,sizeof(ptr->publicaddr)); ptr->lasttime = (uint32_t)time(NULL); portable_mutex_unlock(&LP_psockmutex); } +int32_t LP_psockmark(char *publicaddr) +{ + int32_t i,retval = -1; struct psock *ptr; + portable_mutex_lock(&LP_psockmutex); + for (i=0; ipublicaddr) == 0 ) + { + printf("mark PSOCKS[%d] %s for deletion\n",i,publicaddr); + ptr->lasttime = 0; + retval = i; + break; + } + } + portable_mutex_unlock(&LP_psockmutex); + return(retval); +} + char *LP_psock(char *myipaddr,int32_t ispaired) { char pushaddr[128],subaddr[128]; uint16_t i,pushport,subport; int32_t timeout,maxsize,pullsock=-1,pubsock=-1; cJSON *retjson=0; @@ -300,7 +319,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) } nanomsg_transportname(0,pushaddr,myipaddr,pushport); nanomsg_transportname(0,subaddr,myipaddr,subport); - LP_psockadd(ispaired,pullsock,pushport,pubsock,subport,subaddr); + LP_psockadd(ispaired,pullsock,pushport,pubsock,subport,subaddr,pushaddr); jaddstr(retjson,"result","success"); jaddstr(retjson,"LPipaddr",myipaddr); jaddstr(retjson,"connectaddr",subaddr);