Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение строки с адресом UDP клиента, из структуры sockaddr_in. 
V
    Опции темы
Fynivx
Дата 20.2.2012, 04:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 13.8.2011

Репутация: нет
Всего: 1



Здравствуйте. Мне нужно получить адрес подключившегося клиента из пришедшей датаграммы. Делаю я это вот так:
Код

char* buf = new char[255];

sockaddr_in client_addr;
socklen_t client_addr_len;
        
buf[recvfrom( sock, buf, 254, 0, (sockaddr*)&client_addr, &client_addr_len )] = '\0';
printf( "Client address: %s:%d\n",
    inet_ntoa(client_addr.sin_addr),
    ntohs(client_addr.sin_port)
);

Но вместо адреса вижу четыре нолика(.

Клиентом подключаюсь с этого же компа по адресу в локалке (192.168.1.2).
Сами данные из сообщений нормально получаются и работают.

Вот задействованный в этом процессе код сервера:
Код

//Network.hpp:
namespace Network {
    class Socket {
    public:
        Socket        ( void );
        ~Socket        ( void );
        void listen        ( unsigned short int port );
    protected:
        int            sock;
        sockaddr_in    addr;
        event        evt;
        bool            listened;
    };
    void onSocketData    ( int sock, short int evt, void *arg );    
}
//Network.cpp:
namespace Network {
    Socket::Socket( void ) {
        sock = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
        if ( sock == -1 ) Console::warn( "Socket not created." );

        memset( (char *) &addr, 0, sizeof(addr) );
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = htonl(INADDR_ANY);

        listened = false;
    }

    Socket::~Socket( void ) {
        if ( listened )
            event_del( &evt );

        close( sock );
    }

    void Socket::listen( unsigned short int port ) {
        Console::debug( "Listening." );

        addr.sin_port = htons( port );

        if ( bind( sock, (sockaddr*)&addr, sizeof(sockaddr_in) ) == -1)
            Console::warn( "Listening failed." );

        if ( ! listened ) {
            event_set( &evt , sock, EV_READ|EV_PERSIST, onSocketData, this );
            event_add( &evt, NULL );
            listened = true;
        }
    }

    void onSocketData(int sock, short int event, void *arg) {
        char* buf = new char[255];

        sockaddr_in client_addr;
        socklen_t client_addr_len;
        
        buf[recvfrom( sock, buf, 254, 0, (sockaddr*)&client_addr, &client_addr_len )] = '\0';
        printf( "Client address: %s:%d\n",
            inet_ntoa(client_addr.sin_addr),
            ntohs(client_addr.sin_port)
        );
        Console::log( buf );
    }
}
//main.cpp:
int main( int argc, char** argv ) {
    event_init();

    Network::Socket socket;
    socket.listen( 9930 );

    while(1) {
        event_loop( EVLOOP_NONBLOCK );
    }

    return 0;
}



Вопрос: что я делаю не так? =/
PM MAIL   Вверх
boostcoder
Дата 20.2.2012, 05:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Код

void onSocketData(int sock, short int event, void *arg) {
    char* buf = new char[255];
    sockaddr_in client_addr;
    socklen_t client_addr_len = sizeof(client_addr);
    int rc;

    //buf[recvfrom( sock, buf, 254, 0, (sockaddr*)&client_addr, &client_addr_len )] = '\0'; // potentially SEGFLT
    if ( (rc = recvfrom( sock, buf, 254, 0, (sockaddr*)&client_addr, &client_addr_len )) != -1 ) {
        buf[rc] = 0;
    } else {
        process with error...
    }
    printf( "Client address: %s:%d\n",
        inet_ntoa(client_addr.sin_addr),
        ntohs(client_addr.sin_port)
    );
    Console::log( buf );

    // не вижу чтоб buf освобождался.
}

PM WWW   Вверх
Fynivx
Дата 20.2.2012, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 13.8.2011

Репутация: нет
Всего: 1



Спасибо. Теперь работает. Я думал, что длину он тоже сам записывает) Глупая ошибка)

А буфер не освобождается, т.к. потом с ним еще продолжается работа)


Это сообщение отредактировал(а) Fynivx - 20.2.2012, 13:32
PM MAIL   Вверх
boostcoder
Дата 20.2.2012, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(Fynivx @  20.2.2012,  13:28 Найти цитируемый пост)
буфер не освобождается, т.к. потом с ним еще продолжается работа

но где-то он должен освобождаться...
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0407 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.