static int ___connect(zfinder_t * finder, int timeout) { zfinder_postproxy_t *my_db; my_db = (zfinder_postproxy_t *) (finder->db); if (my_db->fp) { return 0; } if (my_db->fd < 0) { my_db->fd = zconnect(finder->uri, timeout); } if (my_db->fd < 0) { return -1; } my_db->fp = zstream_open_FD(my_db->fd); return 0; }
int zconnectx(zsock_t sock, const char *host, uint16_t port, int listenq, int timeout_ms){ int ret; zsockaddr_in addr; ret = zinet_addr(&addr, host, port); if(ret != ZOK){ return(ret); } if(listenq > 0){ int reuse = 1; zsock_nonblock(sock, 0); setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)); zbind(sock, (ZSA*)&addr, sizeof(addr)); ret = zlisten(sock, listenq); }else{ if(-1 == timeout_ms){ // block connect #if ZTRACE_SOCKET ZDBG("start block connect..."); #endif zsock_nonblock(sock, 0); ret = zconnect(sock, (ZSA*)&addr, sizeof(addr)); zsock_nonblock(sock, 1); #if ZTRACE_SOCKET ZDBG("block connect end."); #endif return ret; } // nonblock connect if(ZOK != (ret = zconnect(sock, (ZSA*)&addr, sizeof(addr)))){ struct timeval tv; fd_set rset, wset; int error; socklen_t len; if(timeout_ms < 1000 || timeout_ms > 15000){ timeout_ms = 4000; } tv.tv_sec = timeout_ms/1000; tv.tv_usec = (timeout_ms%1000)*1000; FD_ZERO(&rset); FD_SET(sock, &rset); FD_ZERO(&wset); FD_SET(sock, &wset); #if ZTRACE_SOCKET ZDBG("conect timeout<sec:%d, usec:%d>", tv.tv_sec, tv.tv_usec); #endif if((ret = zselect(sock+1, &rset, &wset, NULL, &tv)) > 0){ ZDBG("select<%d>", ret); len = sizeof(error); getsockopt(sock, SOL_SOCKET, SO_ERROR, &error,&len); if(0 == error){ ret = ZOK; ZDBG("connect ok"); }else{ ret = ZFAIL; ZDBG("connect fail"); } }else{ ret = ZTIMEOUT; } } } ZERRC(ret); return(ret); }