Longobard
написал 25 апреля 2004 года в 16:59 (1066 просмотров)
Ведет себя
как мужчина; открыл 291 тему в форуме, оставил 2499 комментариев на сайте.
Помогите!
Есть класс connection
#ifndef CONNECTION_H
#define CONNECTION_H
#include "autoheader.h"
using std::string;
/* Класс connection для обработки подключений. В него включены дескрипторы сокета и ip клиента.
Реализация в connection.cpp */
struct traffic_count
{
long double input;
long double output;
char in_type;
char out_type;
};
class connection
{
private:
int connfd;
string client_ip;
struct traffic_count traf;
bool count_in_traf;
bool count_out_traf;
public:
connection( int cofd, const char* IP, bool count_in = false, bool count_out = false);
~connection();
void f_write(void * ptr, size_t nbytes );
ssize_t f_read(void * ptr, size_t nbytes);
struct traffic_count GetTraffic (void) const;
string GetClientIP (void);
};
#define TT_BYTE 0x1
#define TT_KBYTE 0x2
#define TT_MBYTE 0x3
#define TT_GBYTE 0x4
#define TT_TBYTE 0x5
#endif
#include "autoheader.h"
#include "unp.h"
#include "connection.h"
#include
void connection::f_write( void * ptr, size_t nbytes ) {
if ( write( connfd, ptr, nbytes ) != ( ssize_t )nbytes )
err_msg( "Write error!" );
if ( count_out_traf ) {
traf.output += ( long int ) nbytes;
if ( traf.output > ( 1024 * pow ( traf.output, traf.out_type ) ) && traf.out_type <= 0x5 ) {
traf.out_type++;
traf.out_type /= 1024;
}
}
}
ssize_t connection::f_read( void * ptr, size_t nbytes ) {
ssize_t n;
if ( ( n = read( connfd, ptr, nbytes ) ) == -1 )
err_sys( "Read error" );
if ( count_in_traf ) {
traf.input += ( long int ) n;
if ( traf.input > ( 1024 * pow ( traf.input, traf.in_type ) ) && traf.in_type <= 0x5 ) {
traf.in_type++;
traf.input /= 1024;
}
}
return n ;
}
connection::connection( int fd , const char * IP, bool count_in , bool count_out ) {
string client_ip = IP;
count_in_traf = count_in;
count_out_traf = count_out;
connfd = fd;
client_ip.erase ( client_ip.rfind( "." ), client_ip.length() );
err_msg( "Connection from %s", client_ip.c_str() );
if ( count_in_traf || count_out_traf )
memset ( & traf, 0, sizeof ( traf ) );
}
connection::~connection ( void ) {
Close ( connfd );
}
string
connection::GetClientIP ( void ) const {
return client_ip;
}
char buffer[512];
connection client (connfd,IP);
ssize_t readed = client.f_read (&buffer, sizeof (buffer));
buffer[readed] = '\0';
http_request request ( buffer );
string ip = client.GetClientIP();
err_msg ("at 36 in servr_main.cpp client ip = %s",ip.c_str());
Здесь функция err_msg пишет в лог. В результате в лог пишется IP из конструктора (пишется без проблем), а из main`a в лог пишется пустая строка. То есть в логе такая ситуция:
IP:
в чем дело? Почему client_ip в конструкторе инициализирован, а функция GetClientIP возвращает пустую строку?!!!??!! Надуеюсь на вашу квалифицированную помощь. Заранее сенькс.
Последние комментарии
-
OlegL, 17 декабря 2023 года в 15:00 →
Перекличка
21
-
REDkiy, 8 июня 2023 года в 9:09 →
Как «замокать» файл для юниттеста в Python?
2
-
fhunter, 29 ноября 2022 года в 2:09 →
Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt?
6
-
Иванн, 9 апреля 2022 года в 8:31 →
Ассоциация РАСПО провела первое учредительное собрание
1
-
Kiri11.ADV1, 7 марта 2021 года в 12:01 →
Логи catalina.out в TomCat 9 в формате JSON
1
DevOps as a Service from Palark
24/7 SRE & DevOps service to cover all your Kubernetes needs.

Нашел. Ошибка тупей некуда :)
меняем на
И все работает :) Короче тред можно закрывать :)