API сокета потока c ++ - PullRequest
       25

API сокета потока c ++

2 голосов
/ 25 октября 2010

Я использую то, что выглядит как хороший 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 );
}

1 Ответ

1 голос
/ 25 октября 2010

Используемый класс Socket имеет закрытый элемент данных:

sockaddr_in m_addr;

Содержит информацию о клиенте, подключенном к сокету. Вы можете получить удобочитаемый адрес с помощью:

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

Что касается изменений, которые необходимо внести, либо сделайте m_addr общедоступным (не рекомендуется), либо добавьте функцию-член, которая может возвращать строку на основе приведенного выше примера кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...