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); }
int32_t nn_local_broadcast(int32_t sock,uint64_t instanceid,int32_t flags,uint8_t *retstr,int32_t len) { int32_t i,sendlen,errs = 0; if ( sock >= 0 ) { for (i=0; i<10; i++) if ( (nn_socket_status(sock,1) & NN_POLLOUT) != 0 ) break; if ( (sendlen= nn_send(sock,(char *)retstr,len,0)) <= 0 ) errs++, printf("sending to socket.%d sendlen.%d len.%d (%s) [%s]\n",sock,sendlen,len,nn_strerror(nn_errno()),retstr); else if ( Debuglevel > 2 ) printf("nn_local_broadcast SENT.(%s) len.%d sendlen.%d vs strlen.%ld instanceid.%llu -> sock.%d\n",retstr,len,sendlen,strlen((char *)retstr),(long long)instanceid,sock); } return(errs); }