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]