Exemple #1
0
	static bool findInt(IntNode *node,int v){
		bool result = false;
		if(node==0){
			return false;
		}
		if(*node==v){
			return true;
		}
	IntNode *n;
	if(*node <v){
		n = node->getRight();
	}else{
		n=  node->getLeft();
	}
	return findInt(n,v);
	}
Exemple #2
0
void waitForNetEvent(struct NSNet *ns, int timeout)
{
  fd_set readfds, writefds, errfds;
  sock_t max_fd;
  struct timeval tv;
  struct NSNetConnectionController *nscc;
  struct NSNetBindHandlerInternal *bindHI;
  struct NSNetConnectionHandlerInternal *connectHI;
  struct NSNetReadHandlerInternal *readerHI;
  int retval;
  int i;
  readfds = ns->readfds;
  writefds = ns->writefds;
  errfds = ns->errfds;
  max_fd = ns->max_fd;
  tv.tv_sec = timeout / 1000;
  tv.tv_usec = (timeout % 1000) * 1000;
  retval = select(max_fd, &readfds, &writefds, &errfds, &tv);
  if (retval > 0) 
  { // There are some fds ready
    int connErrno, connErrnoLen = sizeof(connErrno);
    for (i = 0; i < ns->max_fd; i+=1)
    {
      char buf[1024];
      if (FD_ISSET(i, &readfds) && (readerHI = findInt(ns->readerMap, i))) {
        int len = read(i, buf, 1024);
        if (len > 0)
          readerHI->nsrh.bytesRead(readerHI->udata, buf, len);
        if (len == 0) {
          close(i);
          readerHI->nsrh.closed(readerHI->udata);
          removeFdAll(ns, i);
          removeReadHandlerInternal(ns, readerHI);
        }
      }
      if (FD_ISSET(i, &readfds) && (bindHI = findInt(ns->bindMap, i))) {
        int addrlen = sizeof(nscc->peer);
        nscc = calloc(sizeof(*nscc), 1);
        nscc->ns = ns;
        nscc->udata = bindHI->udata;
        nscc->fd = accept(i, (struct sockaddr *) &nscc->peer, &addrlen);
        setNSnonblocking(ns, nscc->fd);
        bindHI->nsb.success(bindHI->udata, nscc);
      }
    }
    for (i = 0; i < ns->max_fd; i+= 1)
    {
      if ((FD_ISSET(i, &writefds) || FD_ISSET(i, &errfds) || FD_ISSET(i, &readfds)) && (connectHI = findInt(ns->connectMap, i)))
      {
        if (getsockopt(connectHI->fd, SOL_SOCKET, SO_ERROR, &connErrno, &connErrnoLen) == 0) 
        {
          switch(connErrno)
          {
            case ECONNREFUSED:
              connectHI->nsc.refused(connectHI->udata);
              removeConnectionHandlerInternal(ns, connectHI);
              break;
            case 0:
              nscc = calloc(sizeof(*nscc), 1);
              nscc->ns = ns;
              nscc->peer = connectHI->dest;
              nscc->fd = connectHI->fd;
              nscc->udata = connectHI->udata;
              removeConnectionHandlerInternal(ns, connectHI);
              connectHI->nsc.success(connectHI->udata, nscc);
              break;
            default:
              printf("Unhandled connErrno: %d\n", connErrno);
              exit(1);
              break;
          }
          return;
        }
      }
    }
  }
}
Exemple #3
0
	bool IntSet::contain(int v){
		return findInt(root,v);
	}