Example #1
0
void      new_read(int fd)
{
  char rbuf[6];
  int i = read (fd, &rbuf, 6);

  if (i < 0) {
    fprintf (stderr, "Socket: Read error: %s\n", strerror (errno));
  } else if (!i) {
    clean_fd(fd);
  } else {
    printf("read New\n");
    if (!strncmp(rbuf, "VIEWER", 6)) {
      printf("New viewer\n");
      fds[fd].type = FD_VIEWER;
      fdviewer = fd;
      fds[fd].fct_write = viewer_write;
    }
    else if (!strncmp(rbuf, "CLIENT", 6)) {
      printf("New client\n");
      fds[fd].type = FD_CLIENT;
      fds[fd].fct_read = client_read;
      //fds[fd].fct_write = client_write;
    }
    fds[fd].buf_read.clear();
    fds[fd].buf_write.clear();
    ++cls;
  }
}
Example #2
0
int		pop_fd(t_fd **fds, t_fd *target)
{
  int		fd;
  t_fd		*ptr;
  char		type;

  fd = target->fd;
  type = target->type;
  if (target == *fds)
    *fds = target->next;
  else
    {
      ptr = *fds;
      while (ptr->next && ptr->next != target)
        ptr = ptr->next;
      if (!ptr->next)
        return (EXIT_SUCCESS);
      ptr->next = ptr->next->next;
    }
  clean_fd(target);
  if (close(fd) == -1)
    return (msg_error(ECLOSE, 1));
  if (type == FD_CLIENT)
    printf("server: closing connection with client number %d.\n", fd);
  return (EXIT_SUCCESS);
}
Example #3
0
void		init_env(t_env *e)
{
  int		i;

  e->maxfd = OPEN_MAX;
  e->fds = xmalloc(sizeof(*e->fds) * e->maxfd);
  i = 0;
  while (i < e->maxfd)
    {
      clean_fd(&e->fds[i]);
      i++;
    }
  return ;
}
Example #4
0
void    client_read(int cs)
{
  int   r;
  packet   buf;

  bzero(&buf, sizeof(buf));
  r = recv(cs, &buf, sizeof(buf), 0);
  if (r <= 0) {
    close(cs);
    clean_fd(cs);
  }
  else {
    if (buf.flags & B11) {
    //  robot->addAction(standUp());
    //  printf("Recv Up!\n");
    }
    else if (buf.flags & B01) {
    //  printf("Recv Shot!\n");
    }
    else if (buf.flags & B12) {
    //  robot->addAction(standDown());
    //  printf("Recv Down!\n");
    }
    else if (buf.flags & B06) {
    //  printf("Recv clear!\n");
    }
    else if (buf.flags & B05) {
      robot->events.clear();
    //  printf("Recv clear!\n");
    }
    if (robot->turn != buf.turn)  {
      robot->turn = buf.turn;
      printf("Recv Turn:%d\n", buf.turn);
    }
    if (robot->height != buf.height)  {
      robot->height = buf.height;
    //  robot->addAction(updateHeight());
    //  printf("Recv Height:%d\n", buf.height);
    }
    if (buf.y != robot->y)  {
      robot->y = buf.y;
      printf("Recv y:%d\n", buf.y);
    }
    if (buf.x != -robot->x)  {
      robot->x = -buf.x;
      printf("Recv x:%d\n", buf.x);
    }
  }
}
Example #5
0
void		init_env(t_env *e)
{
  int		i;
  struct rlimit	rlp;

  X(-1, getrlimit(RLIMIT_NOFILE, &rlp), "getrlimit");
  e->maxfd = rlp.rlim_cur;
  e->fds = (t_fd*)X(NULL, malloc(sizeof(*e->fds) * e->maxfd), "malloc");
  i = 0;
  while (i < e->maxfd)
    {
      clean_fd(&e->fds[i]);
      i++;
    }
}
Example #6
0
void		client_read(t_data *data, int cs)
{
	int		blen;

	blen = strlen(data->fds[cs].buf_read);
	if (recv(cs, data->fds[cs].buf_read + blen, BUF_SIZE - blen, 0) <= 0)
	{
		close(cs);
		clean_fd(data->fds + cs);
		printf("client %d has disconnected\n", cs);
	}
	else if (data->fds[cs].buf_read[strlen(data->fds[cs].buf_read) - 1]
			== '\n')
		bufread_handl(data, data->fds[cs].buf_read, cs);
}
Example #7
0
void			srv_accept(t_env *e, int s)
{
  int			cs;
  struct sockaddr_in	csin;
  socklen_t		csin_len;

  csin_len = sizeof(csin);
  cs = X(-1, accept(s, (struct sockaddr*)&csin, &csin_len), "accept");
  printf("New client #%d from %s:%d\n", cs,
	 inet_ntoa(csin.sin_addr), ntohs(csin.sin_port));
  clean_fd(&e->fds[cs]);
  e->fds[cs].type = FD_CLIENT;
  e->fds[cs].fct_read = client_read;
  e->fds[cs].fct_write = client_write;
}
Example #8
0
static void		st_clean(t_env *env, char *tmp, int cs)
{
	if (cs == env->graphic && ft_strstr(tmp, "seg ") != NULL)
	{
		printf("END\n");
		env->end = YES;
	}
	ft_lstdel(&(env->fd_socket[cs].line), ft_del);
	ft_bzero(env->fd_socket[cs].buf_write, BUF_SIZE);
	if (cs != env->graphic
			&& env->fd_socket[cs].type == CLIENT
			&& ft_strstr(tmp, "mort\n") != NULL)
		clean_fd(&env->fd_socket[cs]);
	ft_memdel((void **)&tmp);
}
Example #9
0
void		sv_receive_command(t_sv_prop *sv, int cl)
{
	int 	rd;
	int		ret_cmd;

	if ((rd = E(-1, recv(CL_SOCK(cl), sv->fds[cl].rd, BUF_SIZE, 0), ERR_RECV, NO_EXIT)) > 0)
	{
		printf("[sv_receive_command] [client : %d] [commande : %s] [lu : %d]\n", cl, sv->fds[cl].rd, rd);
		sv->cmd->cmda = lexer(sv->fds[cl].rd);
		ret_cmd = execute(sv, cl);
		if (!ret_cmd)
			pterr(ERR_CMD_NOT_FOUND);
		ft_strarray_del(&(sv->cmd->cmda));
		//ft_bzero(sv->fds[cl].rd, rd);
		ft_bzero(sv->fds[cl].rd, BUF_SIZE + 1);		
	}
	else
		clean_fd(&(sv->fds[cl]));
}
Example #10
0
void			srv_accept(t_env *env, int s)
{
	int						c_sock;
	struct sockaddr_in		c_sin;
	socklen_t				len;
	char					*buff;

	len = sizeof(c_sin);
	c_sock = tryint(-1, accept(s, (t_sockaddr *)&c_sin, &len), "accept");
	disp_new_client(c_sock, c_sin);
	clean_fd(&env->fds[c_sock]);
	env->fds[c_sock].type = FD_CLIENT_WAITING;
	env->fds[c_sock].fct_read = wait_read;
	env->fds[c_sock].fct_write = wait_write;
	buff = ft_itoa(c_sock);
	env->fds[c_sock].nick = ft_strjoin("#", buff);
	setup_ping(env, c_sock);
	ringbuff_write(env->fds[c_sock].buf_write, env->fds[c_sock].ping, 5);
	ringbuff_write(env->fds[c_sock].buf_write, "\n\r", 2);
	free(buff);
}
Example #11
0
void						srv_accept(t_env *e, int s)
{
	int						cs;
	struct sockaddr_in		csin;
	socklen_t				csin_len;
	char					buf[4096];

	csin_len = sizeof(csin);
	cs = X(-1, accept(s, (struct sockaddr*)&csin, &csin_len), "accept");
	clean_fd(&e->fds[cs]);
	e->fds[cs].type = FD_CLIENT;
	e->fds[cs].fct_read = client_read;
	e->fds[cs].fct_write = client_write;
	e->fds[cs].nicktrue = 0;
	e->fds[cs].nick = NULL;
	e->fds[cs].noteam = 1;
	memcpy(buf, "BIENVENUE\n", BUF_SIZE);
	write(cs, buf, ft_strlen(buf));
	srv_accept_(cs, e);
	return ;
}
Example #12
0
void	client_read(t_env *e, int cs)
{
  int	r;
  int	i;

  r = recv(cs, e->fds[cs].buf_read, BUF_SIZE, 0);
  if (r <= 0)
    {
      close(cs);
      clean_fd(&e->fds[cs]);
      printf("client #%d gone away\n", cs);
    }
  else
    {
      i = 0;
      while (i < e->maxfd)
	{
	  if ((e->fds[i].type == FD_CLIENT) &&
	      (i != cs))
	    send(i, e->fds[cs].buf_read, r, 0);
	  i++;
	}
    }
}