All pastes #1891347 Raw Edit

Unnamed

public text v1 · immutable
#1891347 ·published 2010-06-28 20:18 UTC
rendered paste body
  FD_ZERO(&sockUp);

  FD_SET(sd, &sockUp);
  FD_SET(fd, &sockUp);

  if(sd > max)
    max = sd;
  if(fd > max)
    max = fd;
  
  logger("Now accepting connections");

  while (1)
  {
    sockUpUse = sockUp;  

    select(max + 1, &sockUpUse, NULL, NULL, NULL);

    if (FD_ISSET(sd, &sockUpUse))
    {
      socklen_t addrlen = sizeof(clientInfo);
      // Prijimam nove spojeni
      int client = accept(sd, (sockaddr*)&clientInfo, &addrlen);
      logger("Connection accepted from %s", inet_ntoa(clientInfo.sin_addr));
      socklist.push_back(client);
    }
    int slen = 0; 
    unsigned char sbuff[BUFSIZE];
    int slenght = 0;
    if(FD_ISSET(fd, &sockUpUse))
    {
      if((slenght = read( fd, sbuff, BUFSIZE)) <= 0)
        usleep(100);
      else
      {
        for(std::vector<int>::iterator i = socklist.begin(); i != socklist.end(); i++)
          slen = send((* i), sbuff, slenght, 0);
	logger("Data received correctly, %d bytes sent to network", slen);
      }
    }
    slen = 0;

    for(std::vector<int>::iterator i = socklist.begin(); i != socklist.end(); i++)
    {
      if (FD_ISSET(*i, &sockUpUse))
      {
	unsigned char buffer[BUFSIZE];
	int lenght;
	if ((lenght = recv(*i, (void *)buffer, BUFSIZE, 0)) <= 0)
	{
	  // Prijato 0 bytu - druha strana uzavrela spojeni
	  socklen_t addrlen = sizeof(clientInfo);
          getpeername((*i), (sockaddr*)&clientInfo, &addrlen);
	  close(*i);
	  logger("Connection closed for %s", inet_ntoa(clientInfo.sin_addr));
 	  socklist.erase(i);
	  // Ukoncim cyklus. Neni dobre pokracovat v prochazeni kontejneru, kdyz jsem vymazal prvek.
	  break;
	}
	else
	{
	  for(std::vector<int>::iterator j = socklist.begin(); j != socklist.end(); j++)
	  {
	    if (*i != *j)
	     slen = send((* j), buffer, lenght, 0);
 	  }
	  if(slen == 0)
	    logger("Data received correctly, but no more clients connected");
	  else
	    logger("Data received correctly, %d bytes sent to network", slen);
	  slen = write(fd, &buffer, lenght);
	  logger("Data received correctly, %d bytes sent to serial device", slen);

	} 
      }
    }

    FD_ZERO(&sockUp);

    FD_SET(sd, &sockUp);
    FD_SET(fd, &sockUp);
    max = 0;
    if(sd > max)
      max = sd;
    if(fd > max)
      max = fd;

    for(std::vector<int>::iterator i = socklist.begin(); i != socklist.end(); i++)
    {
      if (*i > max)
      {
	max = *i;
      }
      FD_SET(*i, &sockUp);
    }
    if (max < sd)
    {
      max = sd;
    }
  }
 
  close(sd);
  close(fd);
  for_each(socklist.begin(), socklist.end(), close);
  logger("Server closed");