예제 #1
0
static void* handler(void *unused)
{
	int i;
	fd_set active_fd_set, read_fd_set;

	FD_ZERO(&active_fd_set);
	FD_SET(server_fd, &active_fd_set);

	while(1) {
		/* block until input arrives on one or more active sockets */
		read_fd_set = active_fd_set;
		if (select(FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0) {
			log_printf("select failure: %s\n", strerror(errno) );
			goto failed;
		}

		/* service all the socket with input pending */
		for(i=0; i < FD_SETSIZE; ++i) {
			if (FD_ISSET(i, &read_fd_set)) {
				if (i == server_fd)
					add_new_connection(i);
			}
		}
	}

failed:
	pthread_detach(pthread_self());
	return NULL;
}
예제 #2
0
int
main(int argc, char *argv[]) {

  int temp;
  int loops = 0;
  int did_work;
  socklen_t addrlen = sizeof(struct sockaddr_storage);
  uber_state_t *uber_state;
  event_state_select_t *mumble;
  connection_t *connection_list;

  connection_t *temp_connection;

  uber_state = (uber_state_t *)malloc(sizeof(uber_state_t));
  uber_state->connection_list = NULL;
  uber_state->event_state = init_event_state();
  mumble = uber_state->event_state;
  uber_state->rdwr_since_accept = 0;

  fprintf(stderr,"Hello there, let's generate some transactions. Uberstate %p connection_list %p event_state %p\n", uber_state,uber_state->connection_list,uber_state->event_state);

  for (loops = 0; loops < atoi(argv[3]); loops++) {
    temp = establish_connection(argv[1],argv[2],AF_INET,&addrlen);

    /* initialize our event_state minfd */
    /* mumble->minfd = temp; */

    temp_connection = add_new_connection(uber_state,
					 temp,
					 CONNECTION_WRITING,
					 128);

    fprintf(stderr,"temp_connection is at %p\n",temp_connection);
  }

  do {
    loops++;
    if (debug > 1) {
      fprintf(stderr,"\nabout to walk loop %d\n",loops);
    }
    did_work = walk_connection_list(uber_state);
    if (!did_work) {
      if (debug) {
	fprintf(stderr,
		"walk_connection_list did no work, time to wait\n");
      }
      did_work = wait_for_events_and_walk(uber_state);
    }
  } while (1);

}
예제 #3
0
int
accept_new_connection(uber_state_t *uber_state, connection_t *listen_connection) 
{
  SOCKET new_conn;
  connection_t *new_connection;

  if (debug) {
    fprintf(stderr,
	    "about to accept on connection %p fd %d\n",
	    listen_connection,
	    listen_connection->sock);
  }

  /* we don't care if the accept actually accepted a new connection,
     just that we tried calling accept. */
  uber_state->rdwr_since_accept = 0;


  new_conn = accept(listen_connection->sock,NULL,NULL);

  if (INVALID_SOCKET != new_conn) {
    
    /* one day we will want to see if this is inherited across
       accept() calls, but for now we just go ahead and make the
       call */

    fcntl(new_conn,F_SETFL, O_NONBLOCK);

    new_connection = add_new_connection(uber_state,
					new_conn,
					CONNECTION_READING,
					128);
    if (debug) {
      fprintf(stderr,
	      "accepted a connection to %p on fd %d\n",
	      new_connection,
	      new_conn);
    }
  }

  return new_conn;
}
예제 #4
0
int isert_conn_established(struct iscsi_conn *iscsi_conn,
			   struct sockaddr *from_addr, int addr_len)
{
	return add_new_connection(&isert_listen_dev, iscsi_conn);
}