Hello list,
I've done some extensive debugging,
I have the following code. For some reason, select just hangs. any ideas?
#include "server.h"

Server::Server()
{
  FD_ZERO ( &master );
  memset ( & addr,0,sizeof (  addr ) );
  tv.tv_sec=0;
  tv.tv_usec=500000;
}

Server::~Server()
{
  if (users.size() )
    {
      unsigned int count=0;
      for ( count=0;count< ( users.size() +1 );count++ )
        {
          delete users[count];
        }
    }
}

__attribute__((fastcall))          BOOL Server::Listen ( int port )
{
  int yes=1;
  listener=socket ( AF_INET, SOCK_STREAM, 0 );
  if (  listener==-1 )
    {
      Log::WriteLog ( "Couldn't create listening point." );
      return 0;
    }
  setsockopt (  listener,SOL_SOCKET,SO_REUSEADDR,&yes, sizeof ( int ) );
  addr.sin_family=AF_INET;
  addr.sin_addr.s_addr = INADDR_ANY;
  addr.sin_port=htons ( port );
  if ( bind (  listener, ( sockaddr* ) & addr,sizeof (  addr ) ) ==-1 )
    {
      perror ( "bind" );
      Log::WriteLog ( "Couldn't bind listening socket." );
      return 0;
    }
  if ( listen (  listener,10 ) ==-1 )
    {
      Log::WriteLog ( "Couldn't listen on socket." );
      return 0;
    }
  return 1;
}

BOOL Server::Pulse()
{
  vector<User*>::iterator it;
  fd_set tset;
  string input;

  tv.tv_sec=0;
  tv.tv_usec=5000;

  memcpy(&tset,&master,sizeof(fd_set));
//lets accept connections:
  Accept();
//now we check for new events:
  if ( ( select(FD_SETSIZE,&tset,NULL,NULL,&tv) ==-1 ) )
    {
      Log::WriteLog("Select error!");
    }
//our main loop:
  for (it=users.begin();it<users.end();it++)
    {
//see if the fd is in the list of active connections.
      if (FD_ISSET ( (*it)->GetConnection(),& master))
        {
          input=(*it)->Read();
          cout <<input <<endl;
          if (input=="")
            {
              KillSocket((*it));
              continue;
            }
          else
            {
//(*it)->Parse(input);
            }
        }
    }
  return true;
}

__attribute__((fastcall)) void Server::PrintBanner(User *con)
{
  fstream input;
  input.open("txt/login",fstream::in);
  string message;
  getline(input,message);
  con->Send(message+"\n");
  while (!input.eof())
    {
      getline(input,message);
      con->Send(message+"\n");
    }
  input.close();
}

void Server::Accept(void)
{
  sockaddr_in addr;
  int len=sizeof ( addr );
  int incoming=0;
  int yes=0;
  memset ( &addr,0,sizeof ( addr ) );
//accept the connection
  incoming=accept (  listener, ( sockaddr* ) &addr, ( socklen_t * ) &len );
  if ( incoming==-1 )
    {
      return;
    }
  else
    {
      ioctl(incoming,FIONBIO,&yes);
      User *usr=new User ( incoming,addr );
      FD_SET ( incoming,& master );
      PrintBanner(usr);
      usr->AttachParser(Login);
      users.push_back ( usr );
      char* msg=new char[128];
      memset ( msg,0,128 );
      strcpy ( msg,"New connection from: " );
      strcat ( msg,inet_ntoa ( addr.sin_addr ) );
      string message=msg;
      Log::WriteLog ( message );
      delete []msg;
      usr->Send ( "\n" );
    }
}

__attribute__((fastcall)) void Server::KillSocket(User* con)
{
  vector<User*>::iterator it;
  close(con->GetConnection());
  for (it=users.begin();it<users.end();it++)
    {
      if ((*it)==con)
        {
          users.erase(it);
          break;
        }
    }
  FD_CLR(con->GetConnection(),&master);
  delete con;
}

void Login(string data,void *obj)
{
  vector <string> tokens;
  User *usr=(User*)obj;
//we'll get the tokens from the string:
  Utils::strtok(data," ",tokens);
  if (tokens[0]=="load")
    {
      return;
    }
  else if (tokens[0]=="create")
    {
      return;
    }
  else
    {
      usr->Send("Invalid command.\n");
      return;
    }
}
Thanks,
Tyler Littlefield
Web: tysdomain.com
email: [email protected]
My programs don't have bugs, they're called randomly added features.


[Non-text portions of this message have been removed]

Reply via email to