Hello, I have a course that is Operational Systems.. My lecturer doesnt explain so much and after He say, You must solve this problem, because u r a programmer.. I have such a problem with linux programming.
I put my code here, He wants, I must allow multi-client to server. It means, server must accept all clients that request from multiple terminal..And also server can send value which clients connected And I must use fork. I tried some ways but no successful. And also he said, you must edit my server codes, you cant own code.
Can u please tell what Im doing wrong?
int main( int argn, char **arg )
{
if ( argn <= 1 ) help( *arg );
int port = 0;
for ( int i = 1; i < argn; i++ )
{
if ( !strcmp( arg[ i ], "-d" ) )
debug = 1;
if ( !strcmp( arg[ i ], "-h" ) )
help( *arg );
if ( *arg[ i ] != '-' && !port )
{
port = atoi( arg[ i ] );
break;
}
}
if ( !port )
{
zprava( ZPR_INFO, "Missing or wrong port!" );
help( *arg);
}
zprava( ZPR_INFO, "Server will listen on port: %d.", port );
// creating socket
int sock_listen = socket( AF_INET, SOCK_STREAM, 0 );
if ( sock_listen == -1 )
{
zprava( ZPR_CHYBA, "Cant create socket.");
exit( 1 );
}
in_addr addr_any = { INADDR_ANY };
sockaddr_in srv_addr;
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons( port );
srv_addr.sin_addr = addr_any;
// reusing port
int opt = 1;
if ( setsockopt( sock_listen, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof( opt ) ) < 0 )
zprava( ZPR_CHYBA, "Cant configure socket properties." );
// binding address and port to socket
if ( bind( sock_listen, (const sockaddr * ) &srv_addr, sizeof( srv_addr ) ) < 0 )
{
zprava( ZPR_CHYBA, "binding failed." );
close( sock_listen );
exit( 1 );
}
// apllication will listen on port
if ( listen( sock_listen, 1 ) < 0 )
{
zprava( ZPR_CHYBA, "cant listen on this port." );
close( sock_listen );
exit( 1 );
}
int sock_client = 0;
while ( 1 )
{
char buf[ 100 ];
fd_set read_wait_set;
FD_ZERO( &read_wait_set );
FD_SET( STDIN_FILENO, &read_wait_set );
//handle - listen or connect to server
if ( sock_client )
{
FD_SET( sock_client, &read_wait_set );
}
else
{
FD_SET( sock_listen, &read_wait_set );
}
//waiting data from handle
if ( select( MAX( sock_client, sock_listen ) + 1,
&read_wait_set, 0, 0, 0 ) < 0 ) break;
// data on stdin?
if ( FD_ISSET( STDIN_FILENO, &read_wait_set ) )
{
// readin from stdin
int l = read( STDIN_FILENO, buf, sizeof( buf ) );
if ( l < 0 )
zprava( ZPR_CHYBA, "Cant read data from stdin." );
else
zprava( ZPR_LADENI, "Read %d bytes from stdin.", l );
// send data to client
l = write( sock_client, buf, l );
if ( l < 0 )
zprava( ZPR_CHYBA, "cant send data to client." );
else
zprava( ZPR_LADENI, "Sent %d bytes to client.", l );
}
else if ( FD_ISSET( sock_listen, &read_wait_set ) )
{
sockaddr_in rsa;
int rsa_size = sizeof( rsa );
// accepting connection
sock_client = accept( sock_listen, ( sockaddr * ) &rsa, ( socklen_t * ) &rsa_size );
if ( sock_client == -1 )
{
zprava( ZPR_CHYBA, "Connection failed." );
close( sock_listen );
exit( 1 );
}
if (fork() !=0)
{
close (sock_client);
continue;
}
else {
if (fork() == 0)
{
uint lsa = sizeof( srv_addr );
// getting own IP
getsockname( sock_client, ( sockaddr * ) &srv_addr, &lsa );
zprava( ZPR_INFO, "My IP: '%s' port: %d",
inet_ntoa( srv_addr.sin_addr ), ntohs( srv_addr.sin_port ) );
// getting IP of client
getpeername( sock_client, ( sockaddr * ) &srv_addr, &lsa );
zprava( ZPR_INFO, "client IP: '%s' port: %d",
inet_ntoa( srv_addr.sin_addr ), ntohs( srv_addr.sin_port ) );
zprava( ZPR_INFO, "ENter 'quit' to quit server." );
}
}
}
}
// data from client
else if ( FD_ISSET( sock_client, &read_wait_set ) )
{
// precteme data od klienta
int l = read( sock_client, buf, sizeof( buf ) );
if ( !l )
{
zprava( ZPR_LADENI, "client closed the connectio." );
close( sock_client );
sock_client = 0;
break;
}
else if ( l < 0 )
zprava( ZPR_LADENI, "Cant read data from client." );
else
zprava( ZPR_LADENI, "Read %d bytes od from client.", l );
// all data to stdout
l = write( STDOUT_FILENO, buf, l );
if ( l < 0 )
zprava( ZPR_CHYBA, "Cant write to stdout." );
// checking if client wants to terminate the connection
if ( !strncasecmp( buf, "close", 5 ) )
{
zprava( ZPR_INFO, "Client entered 'close' connection is closing." );
zprava( ZPR_INFO, "Waiting for new client." );
close( sock_client );
sock_client = 0;
}
}
//quit server?
if ( !strncasecmp( buf, "quit", 4 ) )
{
close( sock_client );
zprava( ZPR_INFO, " 'quit'. Server si closing connection.\n" );
break;
}
}
close( sock_listen );
return 0;
}