Вставка записей в MySql средствами С++

Модератор: Модераторы разделов

Аватара пользователя
defax
Сообщения: 44
ОС: Linux Gentoo 2007.0 2.6.22

Вставка записей в MySql средствами С++

Сообщение defax »

Код:

#include <stdio.h> #include <iostream> #include <errno.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <iomanip> #include <mysql.h> using namespace std; MYSQL mysql; MYSQL_RES *res; MYSQL_ROW row; //vars int fd[2]; int ret; int i; void exiterr(int exitcode) { fprintf(stderr, "%s\n", mysql_error(&mysql)); exit(exitcode); } main(){ uint i = 0; if (!(mysql_real_connect(&mysql,"127.0.0.1","root","111111","traf",3306, NULL,0))) exiterr(1); FILE *file; char src[16]; char dst[16]; char pack[16]; char bytes[16]; char sport[16]; char dport[16]; char proto[16]; char iface[16]; file = popen ("rsh 127.0.0.1 sh ip acco", "r"); if (file!=NULL){ while (!feof(file)){ if (fscanf(file, "%s", src)) if (fscanf(file, "%s", dst)) if (fscanf(file, "%s", pack)) if (fscanf(file, "%s", bytes)) if (fscanf(file, "%s", sport)) if (fscanf(file, "%s", dport)) if (fscanf(file, "%s", proto)) if (fscanf(file, "%s", iface)) if ( (src[0] == 'A') ){ break; } if ( (sizeof(src) > 0) && (src[0] != 'S') ){ if (mysql_query(&mysql,"INSERT INTO stattemp VALUES ('','','sport','dport','bytes',INET_ATON('src'),INET_ATON('dst'))")) exiterr(3); } } } pclose (file); mysql_close(&mysql); system("rsh 127.0.0.1 clear ip acco"); }


Сам код рабочий, проблема в том что в поля таблицы заносятся не значение переменных sport, dport,bytes..... а просто текст sport, dport,bytes...

то-есть получается вот так:
src_port | dst_port | all_bytes |
----------|-----------|------------|
sport dport bytes
sport dport bytes
sport dport bytes
sport dport bytes
sport dport bytes

как сделать что-бы заносились значения переменных, а не этот текст?
Спасибо сказали:
Аватара пользователя
Dem0n3D
Сообщения: 23
ОС: Ubuntu 10.10 32bit

Re: Вставка записей в MySql средствами С++

Сообщение Dem0n3D »

Во первых, это не С++ а С.
Во вторых:
char s[512] = '';
sprintf(s,"INSERT INTO stattemp VALUES ('','','%s','%s','%s',INET_ATON('%s'),INET_ATON('%s'))",sport,dport,bytes,src,dst);
mysql_query(&mysql,s)

Вот помоему так, но точно эту функцию не помню.
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: Вставка записей в MySql средствами С++

Сообщение AestheteAnimus »

...
В-третьих, рекоммендую всегда использовать snprintf, дабы не плодить в коде уязвимости. К томуже, 512 байт - явно мало для буфера.
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4463
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Вставка записей в MySql средствами С++

Сообщение Rootlexx »

AestheteAnimus писал(а):
24.12.2008 00:36
В-третьих, рекоммендую всегда использовать snprintf, дабы не плодить в коде уязвимости. К томуже, 512 байт - явно мало для буфера.

Почему бы не использовать в таком случае asprintf()? Только _GNU_SOURCE не забудьте установить.
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: Вставка записей в MySql средствами С++

Сообщение AestheteAnimus »

Rootlexx писал(а):
27.12.2008 01:23
Почему бы не использовать в таком случае asprintf()? Только _GNU_SOURCE не забудьте установить.

Нет такой функции в ANSI C. Не говоря уже о том, что спорный вопрос, а хорошо ли вообще каждый раз malloc-ом плодить новый буфер?
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4463
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Вставка записей в MySql средствами С++

Сообщение Rootlexx »

AestheteAnimus писал(а):
27.12.2008 02:26
Не говоря уже о том, что спорный вопрос, а хорошо ли вообще каждый раз malloc-ом плодить новый буфер?

Если не забывать его потом освобождать, то вполне неплохо. Особенно учитывая, что памяти выделяется ровно столько, сколько нужно. Конечно, циклическое выделение памяти занимает ресурсы, что будет медленнее, чем использование одного и того же буфера, зато позволяет не заботиться о максимальной длине строки.
Спасибо сказали:
Аватара пользователя
defax
Сообщения: 44
ОС: Linux Gentoo 2007.0 2.6.22

Re: Вставка записей в MySql средствами С++

Сообщение defax »

Dem0n3D писал(а):
22.12.2008 23:17
Во первых, это не С++ а С.
Во вторых:
char s[512] = '';
sprintf(s,"INSERT INTO stattemp VALUES ('','','%s','%s','%s',INET_ATON('%s'),INET_ATON('%s'))",sport,dport,bytes,src,dst);
mysql_query(&mysql,s)

Вот помоему так, но точно эту функцию не помню.


спосибо за ответ все прекрасно заработало.

У меня тут появилась еще одна проблема. Может кто уже сталкивался?
поток file = popen ("rsh 127.0.0.1 sh ip acco", "r"); имеет вид:

src dst pack bytes sport dport proto iface
192.168.1.1 192.168.1.55 2 40 345 554 6 eth0
192.168.1.1 192.168.5.55 2 40 345 554 6 eth0
192.168.1.1 192.168.22.55 2 40 345 554 6 eth0
172.17.1.1 172.17.1.34 2 40 345 554 6 eth0

192.168.1.1 213.180.204.8 5 40 345 80 6 eth0
172.17.1.89 194.87.0.50 5 40 345 80 6 eth0

здесь видно, что пакеты летают как на локальные 192.168.0.0/16, 172.17.0.0/16 адреса так и на внешние 213.180.204.8 194.87.0.50
как-нибудь можно разграничить трафик на локальный и Internet; входящй, исходящий средствами C++ или MySQL?
Спасибо сказали: