tal0n
05-07-2003, 04:05 AM
I am getting a run time error when I run a program. I will include the source to the server and client.
select: Bad File Number
// Server of tal0n
#include "tal0n_.h"
#include "list.h"
#define port 9090
#define BACKLOG 15
int main()
{
fd_set master; // master list for select()
struct sockaddr_in server; // server structure
struct sockaddr_in client;
struct timeval time; // client structure
int fdlarge; // hold largest file discriptor for select()
int top, newfd; // server socket file discriptor
char *buf; // buffer for clients
int addrlen, i, j;
WSADATA wsaData; // Needed for Windows Socket
char *announ, *user;
char *timeout = "Server timedout due to inactivity";
tal0n_ tserv;
int bytes;
time.tv_sec = 120;
if ( WSAStartup(MAKEWORD(1,1), &wsaData) != 0 )
{
cout << "Error in WSAStartup";
return 1;
}
FD_ZERO(&master);
if (( top = socket( AF_INET, SOCK_STREAM, 0)) == -1)
{
cout << "Error in socket";
return 1;
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(port);
memset( &(server.sin_zero), '\0', 8);
if ( bind(top, ( struct sockaddr *)&server, sizeof(server)) == -1)
{
cout << "Error in bind";
return 1;
}
if ( listen( top, BACKLOG) == -1)
{
cout << "Error in listen";
return 1;
}
FD_SET(top, &master);
fdlarge = top;
while (1)
{
if( select( fdlarge+1, &master, NULL, NULL, &time) == -1)
{
cout << "Select Error";
return 1;
}
for ( int i=0; i <= fdlarge; i++ )
{
if ( FD_ISSET(i, &master) )
{
if (i == top)
{
// Handle new connections
int size = sizeof(client);
if ((newfd = accept(top, (struct sockaddr *)&client, &size)) == -1)
cout << "Error in Accept";
else
{
FD_SET(newfd, &master); // Add to set
if (newfd > fdlarge)
fdlarge = newfd;
announ = newuser( i, &client );
tserv.announce(announ, fdlarge, top);
// Show Status
cout << "selectserver: new connection from " << inet_ntoa(client.sin_addr) << endl;
}
}
else
{
if ( (bytes = recv( i, buf, sizeof(buf), 0)) < 0 )
{
cout << i << " disconnected";
closesocket(i);
FD_CLR(i, &master);
return 1;
}
else
{
user = getuser( tserv.getIp( i ) );
for ( int j=0; j <= fdlarge; j++ )
{
if ( j != top )
{
user = strcat( user, ": " );
user = strcat( user, buf );
tserv.sendall( j, user, bytes );
}
}
}
}
}
else
{
for ( int l=0; l <= fdlarge; l++ )
{
if ( l != top )
{
tserv.sendall( j, timeout, strlen(timeout) );
FD_CLR( l, &master );
}
}
}
}
}
return 0;
}
//Client tal0n
#include "tal0n_.h"
#define PORT 9090
#define MAX 256
struct sockaddr_in them;
struct hostent *he;
fd_set readfds, writefds;
int main(int argc, char *argv[])
{
tal0n_ cl;
char *prompt=">>";
char buf[MAX], rec[MAX];
char name[MAX];
int unsigned top, fdlarge, len;
WSADATA info;
FD_ZERO(&writefds);
FD_ZERO(&readfds);
FD_SET(top, &readfds);
FD_SET(top, &writefds);
if ( argc < 2 )
{
cout << "Usage: tal0n <IP address or Host Name>";
return 1;
}
cout << "Enter your user name: ";
cin >> name;
if (WSAStartup(MAKEWORD(1, 1), &info) != 0)
{
perror("WSAStartup");
return 1;
}
if((he=gethostbyname(argv[1])) == NULL )
{
perror("gethostbyname");
return 1;
}
if (( top=socket(AF_INET, SOCK_STREAM, 0)) == -1 )
{
perror("socket");
return 1;
}
fdlarge = top;
them.sin_family=AF_INET;
them.sin_port=htons(PORT);
them.sin_addr=*((struct in_addr *)he->h_addr);
memset( &(them.sin_zero), '\0', 8); // Zero out rest of the structure
if (connect(top, (struct sockaddr *)&them, sizeof(struct sockaddr)) == -1)
{
perror("connect");
return 0;
}
if ( cl.sendall( top, name, sizeof(name)) == -1 )
{
perror("sendall");
return 1;
}
//Main Loop
while(1)
{
if (select( fdlarge+1, &readfds, &writefds, NULL, NULL) < 0)
{
perror("select");
return 1;
}
if (FD_ISSET(top, &readfds))
{
if (recv(top, rec, sizeof(buf), 0) <= 0)
{
cout << "Server disconnected." << endl;
return 1;
}
rec[strlen(rec) + 1] = '\0';
cout << rec << endl;
}
cout << prompt;
cin >> buf;
len = strlen(buf) - 1;
if (cl.quitme( buf, len ) == 1 )
{
buf[len-3] = '\0';
if ( cl.sendall( top, name, sizeof(name)) == -1 )
{
perror("sendall");
return 1;
}
closesocket(top);
cout << "Goodbye";
}
else
{
if ( cl.sendall( top, name, sizeof(name)) == -1 )
{
perror("sendall");
return 1;
}
}
}
closesocket(top);
return 0;
}
select: Bad File Number
// Server of tal0n
#include "tal0n_.h"
#include "list.h"
#define port 9090
#define BACKLOG 15
int main()
{
fd_set master; // master list for select()
struct sockaddr_in server; // server structure
struct sockaddr_in client;
struct timeval time; // client structure
int fdlarge; // hold largest file discriptor for select()
int top, newfd; // server socket file discriptor
char *buf; // buffer for clients
int addrlen, i, j;
WSADATA wsaData; // Needed for Windows Socket
char *announ, *user;
char *timeout = "Server timedout due to inactivity";
tal0n_ tserv;
int bytes;
time.tv_sec = 120;
if ( WSAStartup(MAKEWORD(1,1), &wsaData) != 0 )
{
cout << "Error in WSAStartup";
return 1;
}
FD_ZERO(&master);
if (( top = socket( AF_INET, SOCK_STREAM, 0)) == -1)
{
cout << "Error in socket";
return 1;
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(port);
memset( &(server.sin_zero), '\0', 8);
if ( bind(top, ( struct sockaddr *)&server, sizeof(server)) == -1)
{
cout << "Error in bind";
return 1;
}
if ( listen( top, BACKLOG) == -1)
{
cout << "Error in listen";
return 1;
}
FD_SET(top, &master);
fdlarge = top;
while (1)
{
if( select( fdlarge+1, &master, NULL, NULL, &time) == -1)
{
cout << "Select Error";
return 1;
}
for ( int i=0; i <= fdlarge; i++ )
{
if ( FD_ISSET(i, &master) )
{
if (i == top)
{
// Handle new connections
int size = sizeof(client);
if ((newfd = accept(top, (struct sockaddr *)&client, &size)) == -1)
cout << "Error in Accept";
else
{
FD_SET(newfd, &master); // Add to set
if (newfd > fdlarge)
fdlarge = newfd;
announ = newuser( i, &client );
tserv.announce(announ, fdlarge, top);
// Show Status
cout << "selectserver: new connection from " << inet_ntoa(client.sin_addr) << endl;
}
}
else
{
if ( (bytes = recv( i, buf, sizeof(buf), 0)) < 0 )
{
cout << i << " disconnected";
closesocket(i);
FD_CLR(i, &master);
return 1;
}
else
{
user = getuser( tserv.getIp( i ) );
for ( int j=0; j <= fdlarge; j++ )
{
if ( j != top )
{
user = strcat( user, ": " );
user = strcat( user, buf );
tserv.sendall( j, user, bytes );
}
}
}
}
}
else
{
for ( int l=0; l <= fdlarge; l++ )
{
if ( l != top )
{
tserv.sendall( j, timeout, strlen(timeout) );
FD_CLR( l, &master );
}
}
}
}
}
return 0;
}
//Client tal0n
#include "tal0n_.h"
#define PORT 9090
#define MAX 256
struct sockaddr_in them;
struct hostent *he;
fd_set readfds, writefds;
int main(int argc, char *argv[])
{
tal0n_ cl;
char *prompt=">>";
char buf[MAX], rec[MAX];
char name[MAX];
int unsigned top, fdlarge, len;
WSADATA info;
FD_ZERO(&writefds);
FD_ZERO(&readfds);
FD_SET(top, &readfds);
FD_SET(top, &writefds);
if ( argc < 2 )
{
cout << "Usage: tal0n <IP address or Host Name>";
return 1;
}
cout << "Enter your user name: ";
cin >> name;
if (WSAStartup(MAKEWORD(1, 1), &info) != 0)
{
perror("WSAStartup");
return 1;
}
if((he=gethostbyname(argv[1])) == NULL )
{
perror("gethostbyname");
return 1;
}
if (( top=socket(AF_INET, SOCK_STREAM, 0)) == -1 )
{
perror("socket");
return 1;
}
fdlarge = top;
them.sin_family=AF_INET;
them.sin_port=htons(PORT);
them.sin_addr=*((struct in_addr *)he->h_addr);
memset( &(them.sin_zero), '\0', 8); // Zero out rest of the structure
if (connect(top, (struct sockaddr *)&them, sizeof(struct sockaddr)) == -1)
{
perror("connect");
return 0;
}
if ( cl.sendall( top, name, sizeof(name)) == -1 )
{
perror("sendall");
return 1;
}
//Main Loop
while(1)
{
if (select( fdlarge+1, &readfds, &writefds, NULL, NULL) < 0)
{
perror("select");
return 1;
}
if (FD_ISSET(top, &readfds))
{
if (recv(top, rec, sizeof(buf), 0) <= 0)
{
cout << "Server disconnected." << endl;
return 1;
}
rec[strlen(rec) + 1] = '\0';
cout << rec << endl;
}
cout << prompt;
cin >> buf;
len = strlen(buf) - 1;
if (cl.quitme( buf, len ) == 1 )
{
buf[len-3] = '\0';
if ( cl.sendall( top, name, sizeof(name)) == -1 )
{
perror("sendall");
return 1;
}
closesocket(top);
cout << "Goodbye";
}
else
{
if ( cl.sendall( top, name, sizeof(name)) == -1 )
{
perror("sendall");
return 1;
}
}
}
closesocket(top);
return 0;
}