Exemple #1
0
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;
}
Exemple #2
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);
}