Я использую то, что выглядит как хороший API для потоковых сокетов, найденных здесь:
http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.html.
У меня проблемы с доступом к IP-адресу подключенного пользователя, поскольку он является закрытым членом класса "Socket", который используется в другом классе "ServerSocket". Моя программа выглядит точно так же, как демонстрационная версия, только если она разветвляется на процессы.
// 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";
}
}
Итак, мой вопрос, не могу ли я получить доступ к IP-адресу клиента, подключенного в данный момент к сокету? Если он должен быть модифицирован для этой функциональности, каким будет самый чистый способ сделать это?
Спасибо за предложения
Мне удалось добавить эти 2 функции, которые позволили мне получить IP только из области действия main следующим образом:
server.get_ip (new_client);
но мне бы очень хотелось, чтобы это было так: new_client.ip ();
вот мои 2 функции, может быть, вы можете помочь мне в дальнейшем:
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 );
}