Exemplo n.º 1
0
static mp_obj_t py_select(uint n_args, const mp_obj_t *args)
{
    int nfds=0; //highest-numbered fd plus 1
    timeval tv={0};
    fd_set rfds, wfds, xfds;

    mp_obj_t *rlist, *wlist, *xlist;
    uint rlist_len, wlist_len, xlist_len;

    /* read args */
    mp_obj_get_array(args[0], &rlist_len, &rlist);
    mp_obj_get_array(args[1], &wlist_len, &wlist);
    mp_obj_get_array(args[2], &xlist_len, &xlist);

    if (n_args == 4) {
        float timeout = mp_obj_get_float(args[3]);
        tv.tv_sec = (int)timeout;
        tv.tv_usec = (timeout-(int)timeout)*1000*1000;
    }

    // add fds to their respective sets
    set_fds(&nfds, rlist, rlist_len, &rfds);
    set_fds(&nfds, wlist, wlist_len, &wfds);
    set_fds(&nfds, xlist, xlist_len, &xfds);

    // call select
    nfds = select(nfds+1, &rfds, &wfds, &xfds, &tv);

    // if any of the read sockets is closed, we add it to the read fd set,
    // a subsequent call to recv() returns 0. This behavior is consistent with BSD.
    for (int i=0; i<rlist_len; i++) {
        socket_t *s = rlist[i];
        if (wlan_get_fd_state(s->fd)) {
            FD_SET(s->fd, &rfds);
            nfds = max(nfds, s->fd);
        }
    }

    // return value; a tuple of 3 lists
    mp_obj_t fds[3] = {
        mp_obj_new_list(0, NULL),
        mp_obj_new_list(0, NULL),
        mp_obj_new_list(0, NULL)
    };

    // On success, select() returns the number of file descriptors contained
    // in the three returned descriptor sets which may be zero if the timeout
    // expires before anything interesting happens, -1 is returned on error.
    if (nfds == -1) {   // select failed
        nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "select failed"));
    } else if (nfds) {  // an fd is ready
        get_fds(rlist, rlist_len, fds[0], &rfds);
        get_fds(wlist, wlist_len, fds[1], &wfds);
        get_fds(xlist, xlist_len, fds[2], &xfds);
    } // select timedout

    return mp_obj_new_tuple(3, fds);
}
Exemplo n.º 2
0
int			wait_for_input(t_socket *socket)
{
  char			*in[2];
  t_buffs		buffs;
  fd_set		fs[2];
  char			*cmd;
  struct timeval	tv;

  if (!create_buffer(&buffs) || !(in[0] = malloc(4097)) ||
      !(in[1] = malloc(4097)) || !memset(in[0], 0, 4097) ||
      !memset(in[1], 0, 4097) || gethostname(in[1], 4096) == -1)
    return (-1);
  while (1)
    {
      tv.tv_sec = 1;
      tv.tv_usec = 0;
      set_fds(&fs[1], &fs[0], socket->fd, &buffs);
      if (select(socket->fd != -1 ? socket->fd + 1 : 1,
		 &fs[0], &fs[1], NULL, &tv) == -1)
	return (puterr_int(ERR_SELECT, -1));
      if (!(cmd = read_all(socket->fd, &fs[0], &buffs, in)) ||
	  write_all(&fs[1], &buffs, socket->fd) == -1 ||
	  (cmd && strcmp(cmd, "") && parse_cmd(cmd, socket,
					       &buffs, in[0]) == -1))
	return (free(in[0]), free(in[1]), -1);
    }
}
Exemplo n.º 3
0
int			receive_clients(int fd)
{
  t_fd			fds;
  int			ret;
  t_all			all;

  init_buffer(&(all.buf));
  all.fds = &fds;
  all.channel = NULL;
  all.fds->fd_s = fd;
  all.actual = NULL;
  new_channel(&all, "toto");
  new_channel(&all, "titi");
  if ((add_fd(&all, SERVER_ID, fd, &serv_ptr)) == -1)
    return (-1);
  while (1)
    {
      all.fds->max_fd = set_fds(&all, &(all.fds->fd_read));
      FD_ZERO(&(all.fds->fd_write));
      if ((ret = select(all.fds->max_fd + 1, &(all.fds->fd_read),
			&(all.fds->fd_write),
			NULL, NULL)) == -1)
	return (1);
      check_fd(&all);
    }
  return (0);
}
Exemplo n.º 4
0
static PyObject*
PyEvents_WaitForEvent(PyObject* unused, PyObject* args)
{
    int nfds;
    fd_set readfds;
    fd_set writefds;
    fd_set errorfds;
    struct timeval timeout;
    unsigned long waittime;
    long milliseconds;
    long result = 0;
    if (!PyArg_ParseTuple(args, "k", &milliseconds)) return NULL;
    waittime = check_timers();
    if (waittime > 0) {
        if (waittime < milliseconds) milliseconds = waittime;
        timeout.tv_sec = milliseconds / 1000;
        timeout.tv_usec = 1000 * (milliseconds % 1000);
        nfds = set_fds(&readfds, &writefds, &errorfds);
        if (select(nfds, &readfds, &writefds, &errorfds, &timeout)==-1)
            return PyErr_SetFromErrno(PyExc_RuntimeError);
    }
    return PyInt_FromLong(result);
}
Exemplo n.º 5
0
int main(){
	struct username username[MAXCLIENTS];
	fd_set rfds;
	time_t t;
	int server_socket, client_socket, max, i, j, laenge, anzahln, erg;
	struct sockaddr_in serverinfo, clientinfo;
	unsigned short int portnummer=5000;
	char serverIp[]="127.0.0.1";
	FILE *verlauf;
	
	for(i=0;i<MAXCLIENTS;i++){
		memset(username[i].username,'\0',NAME);
	}

	verlauf=fopen("./chat_Verlauf.txt","r");
	if(verlauf==NULL){
		verlauf=fopen("./chat_Verlauf.txt","w");
		printf("\nchat_Verlauf.txt neu erstellt");
	}
	fclose(verlauf);

	
	printf("\nserver: socket()..");
	
	server_socket=socket(AF_INET,SOCK_STREAM,0);
	
	serverinfo.sin_family=AF_INET;
	inet_pton(AF_INET,serverIp,&serverinfo.sin_addr.s_addr);
	serverinfo.sin_port=htons(portnummer);
	laenge=sizeof(serverinfo);

	printf("\nserver:bind()...");
	
	bind(server_socket, (struct sockaddr *)&serverinfo, laenge);

	printf("\nserver:listen()...");
	printf("\nserver mit IP: %s",serverIp);
	printf("\nan Port 5000 wartet...");
	

	listen(server_socket,15);
	
	
	for(i=0;i<MAXCLIENTS; i++){
		username[i].client=-1;
	}
	
	i=0;
	

while(1){
	fflush(stdout);
	max = set_fds(server_socket, username, &rfds);
	
	select(max+1, &rfds, NULL, NULL, NULL);

	if(FD_ISSET(server_socket, &rfds)){
		if(i<MAXCLIENTS){
			client_socket=accept(server_socket, NULL, 0);
			laenge=read(client_socket,username[i].username,sizeof(username[i].username));
			username[i].username[laenge]='\0';
						


			t=time(NULL);
			username[i].time=(char *)malloc(TIME);
			username[i].time=ctime(&t);
			username[i].time[24]='\0';
		
			printf("\nNeuer Teilnehmer ist aufgenommen. %s ist seit %s online!\n",username[i].username,username[i].time);
			username[i].client=client_socket;
			for(j=0;j<MAXCLIENTS;j++)
				if(username[j].client==username[i].client)
					continue;
				write(username[j].client,username[i].username,sizeof(username[i].username));	
			i++;
		}	
		else{
			printf("\nServer voll\n");
			send(client_socket,"\nServer ist voll!\n",sizeof("\nServer ist voll!\n"),0);
			continue;
		}
		continue;
	}
	i = com(username,&rfds, i);
	
}
}
Exemplo n.º 6
0
static int wait_for_stdin(void)
{
    int fd;
    int mask;
    int fd_stdin = fileno(stdin);
    int ready;
    int nfds;
    long int waittime;
    fd_set readfds;
    fd_set writefds;
    fd_set errorfds;
    struct timeval timeout;
    struct timeval* ptimeout;
    SocketObject* socket;
    PyGILState_STATE gstate;
    PyObject* exception_type;
    PyObject* exception_value;
    PyObject* exception_traceback;
    PyObject* result;
    PyObject* arguments;
    while (1) {
        nfds = set_fds(&readfds, &writefds, &errorfds);
        FD_SET(fd_stdin, &readfds);
        if (fd_stdin >= nfds) nfds = fd_stdin + 1;
        waittime = process_timers();
        if (waittime == ULONG_MAX) ptimeout = NULL;
        else {
            timeout.tv_sec = waittime / 1000;
            timeout.tv_usec = 1000 * (waittime % 1000);
            ptimeout = &timeout;
        }
        if (select(nfds, &readfds, &writefds, &errorfds, ptimeout)==-1)
        {
            if (errno==EINTR) raise(SIGINT);
            return -1;
        }
        if (FD_ISSET(fd_stdin, &readfds)) break;
        socket = notifier.firstSocket;
        while (socket)
        {
            ready = 0;
            fd = socket->fd;
            mask = socket->mask;
            switch (mask) {
                case PyEvents_READABLE: ready = FD_ISSET(fd, &readfds); break;
                case PyEvents_WRITABLE: ready = FD_ISSET(fd, &writefds); break;
                case PyEvents_EXCEPTION: ready = FD_ISSET(fd, &errorfds); break;
            }
            if (ready) {
                gstate = PyGILState_Ensure();
                PyErr_Fetch(&exception_type, &exception_value, &exception_traceback);
                result = NULL;
                arguments = Py_BuildValue("(ii)", fd, mask);

                if (arguments) {
                    PyObject* callback = socket->callback;
                    result = PyEval_CallObject(callback, arguments);
                    Py_DECREF(arguments);
                }
                if (result) Py_DECREF(result);
                else PyErr_Print();
                PyErr_Restore(exception_type, exception_value, exception_traceback);
                PyGILState_Release(gstate);
            }
            socket = socket->next;
        }
    }
    return 1;
}