int32_t _lb_socket(uint16_t port,uint16_t globalport,uint16_t relaysport,int32_t maxmillis,char servers[][MAX_SERVERNAME],int32_t num,char backups[][MAX_SERVERNAME],int32_t numbacks,char failsafes[][MAX_SERVERNAME],int32_t numfailsafes) { int32_t lbsock,timeout,retrymillis,priority = 1; if ( (lbsock= nn_socket(AF_SP,NN_REQ)) >= 0 ) { retrymillis = (maxmillis / 30) + 1; printf("!!!!!!!!!!!! lbsock.%d !!!!!!!!!!!\n",lbsock); if ( nn_setsockopt(lbsock,NN_SOL_SOCKET,NN_RECONNECT_IVL,&retrymillis,sizeof(retrymillis)) < 0 ) printf("error setting NN_REQ NN_RECONNECT_IVL_MAX socket %s\n",nn_errstr()); else if ( nn_setsockopt(lbsock,NN_SOL_SOCKET,NN_RECONNECT_IVL_MAX,&maxmillis,sizeof(maxmillis)) < 0 ) fprintf(stderr,"error setting NN_REQ NN_RECONNECT_IVL_MAX socket %s\n",nn_errstr()); timeout = SUPERNET.PLUGINTIMEOUT; if ( nn_setsockopt(lbsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)) < 0 ) printf("error setting NN_SOL_SOCKET NN_RCVTIMEO socket %s\n",nn_errstr()); timeout = 100; if ( nn_setsockopt(lbsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)) < 0 ) printf("error setting NN_SOL_SOCKET NN_SNDTIMEO socket %s\n",nn_errstr()); if ( num > 0 ) priority = nn_add_lbservers(port,globalport,relaysport,priority,lbsock,servers,num); if ( numbacks > 0 ) priority = nn_add_lbservers(port,globalport,relaysport,priority,lbsock,backups,numbacks); if ( numfailsafes > 0 ) priority = nn_add_lbservers(port,globalport,relaysport,priority,lbsock,failsafes,numfailsafes); } else printf("error getting req socket %s\n",nn_errstr()); //printf("RELAYS.lb.num %d\n",RELAYS.lb.num); return(lbsock); }
char *nn_loadbalanced(uint8_t *data,int32_t len) { char *msg,*jsonstr = 0; int32_t sendlen,i,lbsock,recvlen = 0; if ( (lbsock= RELAYS.lbclient) < 0 ) return(clonestr("{\"error\":\"invalid load balanced socket\"}")); for (i=0; i<10; i++) if ( (nn_socket_status(lbsock,1) & NN_POLLOUT) != 0 ) break; if ( Debuglevel > 2 ) printf("sock.%d NN_LBSEND.(%s)\n",lbsock,data); //fprintf(stderr,"send to network\n"); if ( (sendlen= nn_send(lbsock,data,len,0)) == len ) { for (i=0; i<10; i++) if ( (nn_socket_status(lbsock,1) & NN_POLLIN) != 0 ) break; if ( (recvlen= nn_recv(lbsock,&msg,NN_MSG,0)) > 0 ) { if ( Debuglevel > 2 ) printf("LBRECV.(%s)\n",msg); jsonstr = clonestr((char *)msg); nn_freemsg(msg); } else { printf("nn_loadbalanced got recvlen.%d %s\n",recvlen,nn_errstr()); jsonstr = clonestr("{\"error\":\"lb recv error, probably timeout\"}"); } } else printf("got sendlen.%d instead of %d %s\n",sendlen,len,nn_errstr()), jsonstr = clonestr("{\"error\":\"lb send error\"}"); return(jsonstr); }
void process_json(cJSON *json,char *remoteaddr,int32_t localaccess) { int32_t sock,len,checklen,sendtimeout,recvtimeout; uint32_t apitag; uint64_t tag; char endpoint[128],numstr[64],*resultstr,*jsonstr; jsonstr = cJSON_Print(json), _stripwhite(jsonstr,' '); len = (int32_t)strlen(jsonstr)+1; apitag = _crc32(0,jsonstr,len); sprintf(endpoint,"ipc://api.%u",apitag); free(jsonstr); if ( (recvtimeout= juint(json,"timeout")) == 0 ) recvtimeout = 30000; sendtimeout = 30000; randombytes((uint8_t *)&tag,sizeof(tag)); if ( cJSON_GetObjectItem(json,"tag") == 0 ) sprintf(numstr,"%llu",(long long)tag), cJSON_AddItemToObject(json,"tag",cJSON_CreateString(numstr)); if ( cJSON_GetObjectItem(json,"apitag") == 0 ) cJSON_AddItemToObject(json,"apitag",cJSON_CreateString(endpoint)); if ( remoteaddr != 0 ) cJSON_AddItemToObject(json,"broadcast",cJSON_CreateString("remoteaccess")); if ( localaccess != 0 ) cJSON_AddItemToObject(json,"localaccess",cJSON_CreateNumber(1)); jsonstr = cJSON_Print(json), _stripwhite(jsonstr,' '); //fprintf(stderr,"localacess.%d remote.(%s) jsonstr.(%s)\r\n",localaccess,remoteaddr!=0?remoteaddr:"",jsonstr); len = (int32_t)strlen(jsonstr)+1; if ( jsonstr != 0 ) { if ( (sock= nn_socket(AF_SP,NN_PAIR)) >= 0 ) { if ( sendtimeout > 0 && nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&sendtimeout,sizeof(sendtimeout)) < 0 ) fprintf(stderr,"error setting sendtimeout %s\n",nn_errstr()); if ( nn_connect(sock,SUPERNET_APIENDPOINT) < 0 ) printf("error connecting to apiendpoint sock.%d type.%d (%s) %s\r\n",sock,NN_PUSH,SUPERNET_APIENDPOINT,nn_errstr()); else if ( (checklen= nn_send(sock,jsonstr,len,0)) != len ) printf("checklen.%d != len.%d for nn_send to (%s)\r\n",checklen,len,SUPERNET_APIENDPOINT); else { if ( recvtimeout > 0 && nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&recvtimeout,sizeof(recvtimeout)) < 0 ) fprintf(stderr,"error setting sendtimeout %s\n",nn_errstr()); if ( nn_recv(sock,&resultstr,NN_MSG,0) > 0 ) { printf("Content-Length: %ld\r\n\r\n",strlen(resultstr)+2); printf("%s\r\n",resultstr); nn_freemsg(resultstr); } else printf("error getting results %s\r\n",nn_errstr()); } nn_shutdown(sock,0); } else printf("error getting pushsock.%s\r\n",nn_errstr()); } free(jsonstr); }
int32_t nn_settimeouts(int32_t sock,int32_t sendtimeout,int32_t recvtimeout) { int32_t retrymillis,maxmillis; maxmillis = SUPERNET.PLUGINTIMEOUT, retrymillis = maxmillis/40; if ( nn_setsockopt(sock,NN_SOL_SOCKET,NN_RECONNECT_IVL,&retrymillis,sizeof(retrymillis)) < 0 ) fprintf(stderr,"error setting NN_REQ NN_RECONNECT_IVL_MAX socket %s\n",nn_errstr()); else if ( nn_setsockopt(sock,NN_SOL_SOCKET,NN_RECONNECT_IVL_MAX,&maxmillis,sizeof(maxmillis)) < 0 ) fprintf(stderr,"error setting NN_REQ NN_RECONNECT_IVL_MAX socket %s\n",nn_errstr()); else if ( sendtimeout > 0 && nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&sendtimeout,sizeof(sendtimeout)) < 0 ) fprintf(stderr,"error setting sendtimeout %s\n",nn_errstr()); else if ( recvtimeout > 0 && nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&recvtimeout,sizeof(recvtimeout)) < 0 ) fprintf(stderr,"error setting sendtimeout %s\n",nn_errstr()); else return(0); return(-1); }
int32_t nn_createsocket(char *endpoint,int32_t bindflag,char *name,int32_t type,uint16_t port,int32_t sendtimeout,int32_t recvtimeout) { int32_t sock; if ( (sock= nn_socket(AF_SP,type)) < 0 ) fprintf(stderr,"error getting socket %s\n",nn_errstr()); if ( bindflag != 0 ) { if ( endpoint[0] == 0 ) expand_epbits(endpoint,calc_epbits(SUPERNET.transport,0,port,type)); if ( nn_bind(sock,endpoint) < 0 ) fprintf(stderr,"error binding to relaypoint sock.%d type.%d to (%s) (%s) %s\n",sock,type,name,endpoint,nn_errstr()); else fprintf(stderr,"BIND.(%s) <- %s\n",endpoint,name); } else if ( bindflag == 0 && endpoint[0] != 0 ) { if ( nn_connect(sock,endpoint) < 0 ) fprintf(stderr,"error connecting to relaypoint sock.%d type.%d to (%s) (%s) %s\n",sock,type,name,endpoint,nn_errstr()); else fprintf(stderr,"%s -> CONNECT.(%s)\n",name,endpoint); } if ( nn_settimeouts(sock,sendtimeout,recvtimeout) < 0 ) { fprintf(stderr,"nn_createsocket.(%s) %d\n",name,sock); return(-1); } return(sock); }
void process_json(cJSON *json) { int32_t sock,i,len,checklen,sendtimeout,recvtimeout; uint32_t apitag; uint64_t tag; char endpoint[128],*resultstr,*jsonstr; jsonstr = cJSON_Print(json), _stripwhite(jsonstr,' '); //fprintf(stderr,"jsonstr.(%s)\r\n",jsonstr); len = (int32_t)strlen(jsonstr)+1; apitag = _crc32(0,jsonstr,len); sprintf(endpoint,"ipc://api.%u",apitag); free(jsonstr); recvtimeout = get_API_int(cJSON_GetObjectItem(json,"timeout"),10000); sendtimeout = 5000; randombytes(&tag,sizeof(tag)); cJSON_AddItemToObject(json,"tag",cJSON_CreateNumber(tag)); cJSON_AddItemToObject(json,"apitag",cJSON_CreateString(endpoint)); //cJSON_AddItemToObject(json,"timeout",cJSON_CreateNumber(recvtimeout)); jsonstr = cJSON_Print(json), _stripwhite(jsonstr,' '); len = (int32_t)strlen(jsonstr)+1; if ( json != 0 ) { if ( (sock= nn_socket(AF_SP,NN_PAIR)) >= 0 ) { if ( sendtimeout > 0 && nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&sendtimeout,sizeof(sendtimeout)) < 0 ) fprintf(stderr,"error setting sendtimeout %s\n",nn_errstr()); if ( nn_connect(sock,SUPERNET_APIENDPOINT) < 0 ) printf("error connecting to apiendpoint sock.%d type.%d (%s) %s\r\n",sock,NN_PUSH,SUPERNET_APIENDPOINT,nn_errstr()); else if ( (checklen= nn_send(sock,jsonstr,len,0)) != len ) printf("checklen.%d != len.%d for nn_send to (%s)\r\n",checklen,len,SUPERNET_APIENDPOINT); else { if ( recvtimeout > 0 && nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&recvtimeout,sizeof(recvtimeout)) < 0 ) fprintf(stderr,"error setting sendtimeout %s\n",nn_errstr()); if ( nn_recv(sock,&resultstr,NN_MSG,0) > 0 ) { printf("Content-Length: %ld\r\n\r\n",strlen(resultstr)+2); printf("%s\r\n",resultstr); nn_freemsg(resultstr); } else printf("error getting results %s\r\n",nn_errstr()); } nn_shutdown(sock,0); } else printf("error getting pushsock.%s\r\n",nn_errstr()); } free(jsonstr); }
int32_t nn_add_lbservers(uint16_t port,uint16_t globalport,uint16_t relaysport,int32_t priority,int32_t sock,char servers[][MAX_SERVERNAME],int32_t num) { int32_t i; char endpoint[512],pubendpoint[512]; struct endpoint epbits; uint32_t ipbits; if ( num > 0 && servers != 0 && nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDPRIO,&priority,sizeof(priority)) >= 0 ) { for (i=0; i<num; i++) { if ( (ipbits= (uint32_t)calc_ipbits(servers[i])) == 0 ) { printf("null ipbits.(%s)\n",servers[i]); continue; } //printf("epbits.%llx ipbits.%x %s\n",*(long long *)&epbits,(uint32_t)ipbits,endpoint); if ( ismyaddress(servers[i]) == 0 ) { epbits = calc_epbits("tcp",ipbits,port,NN_REP); expand_epbits(endpoint,epbits); if ( nn_connect(sock,endpoint) >= 0 ) { printf("+R%s ",endpoint); add_relay(&RELAYS.active,epbits); } if ( RELAYS.subclient >= 0 ) { if ( SUPERNET.iamrelay != 0 ) { epbits = calc_epbits("tcp",ipbits,relaysport,NN_PUB); expand_epbits(pubendpoint,epbits); if ( nn_connect(RELAYS.subclient,pubendpoint) >= 0 ) printf("+P%s ",pubendpoint); } epbits = calc_epbits("tcp",ipbits,globalport,NN_PUB); expand_epbits(pubendpoint,epbits); if ( nn_connect(RELAYS.subclient,pubendpoint) >= 0 ) printf("+P%s ",pubendpoint); } } } priority++; } else printf("error setting priority.%d (%s)\n",priority,nn_errstr()); return(priority); }