views:

49

answers:

1

I'm using what looks to be a real nice API for streaming sockets found here: http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.html.

I'm having trouble accessing the IP of the connected user because its a private member of a class "Socket" that is used within another class "ServerSocket". My program looks exactly like the demo only it it forks processes.

// libraries
#include <signal.h>
#include <string>
#include <iostream>

// headers
#include "serversocket.hpp"
#include "socketexception.hpp"
#include "config.hpp"

using namespace std;

void sessionHandler( ServerSocket );


int main ( int argc, char** argv )
{
    configClass config; // this object handles command line args
    config.init( argc, argv ); // initialize config with args

    pid_t childpid; // this will hold the child pid

    signal(SIGCHLD, SIG_IGN); // this prevents zombie processes on *nix

    try
    {
        ServerSocket server ( config.port ); // create the socket

        cout << "server alive" << "\n";
        cout << "listening on port: " << config.port << "\n";

        while ( true )
        {

            ServerSocket new_client; // create socket stream
            server.accept ( new_client ); // accept a connection to the server

            switch ( childpid = fork() ) // fork the child process
            {
            case -1://error
                cerr << "error spawning child" << "\n";
                break;
            case 0://in the child
                sessionHandler( new_client ); // handle the new client
                exit(0); // session ended normally
                break;
            default://in the server
                cout << "child process spawned: " << childpid << "\n";
                break;
            }
        }
    }
    catch ( SocketException& e ) // catch problem creating server socket
    {
        cerr << "error: " << e.description() << "\n";
    }

    return 0;
}


// function declarations

void sessionHandler( ServerSocket client )
{
    try
    {
        while ( true )
        {
            string data;
            client >> data;
            client << data;
        }
    }
    catch ( SocketException& e )
    {
        cerr << "error: " << e.description() << "\n";
    }
}

So my question is, can I not access the IP of the client currently connected to the socket? If it has to be modified for that functionality, what would the cleanest way to do it be?

Thanks for suggestions

I was able to add these 2 functions that allowed me to get the IP only from the scope of main like this:

server.get_ip( new_client ); but what I'd really like is to get it like this new_client.ip();

here's my 2 functions, maybe you can help me further:

std::string Socket::get_ip( Socket& new_socket )
{
  char cstr[INET_ADDRSTRLEN];
  std::string str;
  inet_ntop(AF_INET, &(m_addr.sin_addr), cstr, INET_ADDRSTRLEN);
  str = cstr;
  return str;
}

std::string ServerSocket::get_ip( ServerSocket& sock )
{
    return Socket::get_ip( sock );
}
+1  A: 

The Socket class you are using has a private data member:

sockaddr_in m_addr;

This contains the info of the client connected to the socket. You can get the human-readable address with:

char str[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(m_addr.sin_addr), str, INET_ADDRSTRLEN);

As for the changes you need to make, either make m_addr public (not recommended) or add a member function that can return a string based on the above code sample.

chrisaycock
thanks I got a little further, and put more details in my question and what I've done so far