- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
len += sprintf(event_xml_msg, XML_TAG_START, XML_KOKOKO_HTTP_PROTOCOL);
// Set <monitor-event>
len += sprintf(strend_ptr(event_xml_msg), XML_TAG_START, XML_MONITOR_EVENT_NODE_TREE);
// Set <date>
len += xml_string_add_tag(event_xml_msg, XML_MONITOR_EVENT_NODE_DATE, dt.date_b);
// Set <time>
len += xml_string_add_tag(event_xml_msg, XML_MONITOR_EVENT_NODE_TIME, dt.time_b);
// Set <product> Ex. "VersAtive"
len += xml_string_add_tag(event_xml_msg, XML_MONITOR_EVENT_NODE_PRODUCT, product_type);
// Set <entity code>
// Supposed to work for all union types
len += xml_int_add_tag(event_xml_msg, XML_MONITOR_EVENT_NODE_CODE, event_code);
// Set <severity>
// len += xml_int_add_tag(event_xml_msg, XML_MONITOR_EVENT_NODE_SEVERITY, severity);
memset(severity_str, 0, sizeof(severity_str));
get_severity_string(severity, severity_str);
len += xml_string_add_tag(event_xml_msg, XML_MONITOR_EVENT_NODE_SEVERITY, severity_str);
// Set event entity name
len += xml_string_add_tag(event_xml_msg, XML_MONITOR_EVENT_NODE_ENTITY_TYPE, entity_name);
// Set event description
if((len + strlen(description)) > (payload_size - footer_size))
{
// TODO HANDLE
printf("Message description overflows buffer size.\n");
return false;
}
len += xml_cdata_string_add_tag(event_xml_msg, XML_MONITOR_EVENT_NODE_DESCRIPTION, description);
// Set params
add_xml_entity_params(event_xml_msg, entity_params);
// Close <monitor-event>
sprintf(strend_ptr(event_xml_msg), XML_TAG_END, XML_MONITOR_EVENT_NODE_TREE);
// Close <HTTPProtocol>
len += sprintf(strend_ptr(event_xml_msg), XML_TAG_END, XML_KOKOKO_HTTP_PROTOCOL);
В проекте широко используется libmxml, а вот блять использовать его по назначению велосипедики не могут.
defecate-plusplus 20.11.2014 12:19 # +4
codemonkey 20.11.2014 12:23 # +3
p.s: Прошу админов выпилить коммент с product name из ГК.
defecate-plusplus 20.11.2014 12:54 # +3
админы не читают комменты
ищи внизу "обратная связь", но шансов на успех около 1%
3.14159265 20.11.2014 12:57 # +1
Простите, что?
defecate-plusplus 20.11.2014 13:01 # +1
bormand 20.11.2014 15:55 # 0
codemonkey 20.11.2014 16:12 # 0
Анонимус 20.11.2014 17:10 # +1
@
Налетай на проблемы с экскейпингом
----------
На все замечания про готовые решения
@
Отвечай что они медленные, а для такой простой задачи хватит и printf
bormand 20.11.2014 18:13 # 0
И шанс на переполнение буфера ну никак нельзя было упустить...
P.S. Или в footer_size уже учтена длина сериализованных entity_params и обертка в виде CDATA вокруг description?
codemonkey 20.11.2014 18:23 # 0
Кроме того, весь payload ограничен 4 КБ.
bormand 20.11.2014 18:26 # 0
Ну типа автор на 146% уверен, что всё, что ниже description'а (и обертка вокруг него тоже) всяко меньше, чем 128 байт...
Т.е. переполнение буфера подтверждается: даже если все эти add_xml_* растягивают буфер (что маловероятно), sprintf'ы в 41 и 44 - нет.
codemonkey 20.11.2014 18:28 # +2
int xml_string_add_tag(char *msg, const char *tag, const char *val)
{
return sprintf(strend_ptr(msg), XML_TAG_START"%s"XML_TAG_END, tag, val, tag);
}
bormand 20.11.2014 18:29 # +1
codemonkey 20.11.2014 18:35 # 0
А эти макро вообще шедевр:
#define XML_GET_NAME(node) ((char *)((mxml_node_t *)(node)->value.element.name))
#define XML_GET_VALUE(node) ((char *)((mxml_node_t *)(node)->value.opaque))
bormand 20.11.2014 18:42 # +2
codemonkey 20.11.2014 18:47 # 0
ЕМНИП, в говномамонтной версии либы нормальных геттеров не было.
bormand 20.11.2014 19:02 # 0
codemonkey 21.11.2014 00:03 # 0
bormand 20.11.2014 18:35 # 0
XML логирование по UDP поди?
codemonkey 20.11.2014 18:41 # +1
Анонимус 20.11.2014 18:42 # 0
bormand 20.11.2014 18:45 # 0
Анонимус 20.11.2014 18:46 # 0
Так сложно сделать реконнект?
Да и если канал постоянно рвется то половина логов просто протеряется
bormand 20.11.2014 18:55 # +1
Анонимус 20.11.2014 18:57 # +3
Можно и так:
1) положить в буфер
2) подождать N милисекунд
3) попробовать снова
Ну а если буфер переполница то старые выкидывать.
Система будет куда как надежнее.
-------
Но UDP зато можно стримить и собирать на 150 серверов независимо.
Куда-то то уж точно дойдет. А при наличии IGMP стримить можно и в другую сеть!
bormand 20.11.2014 18:57 # 0
В точку!
Анонимус 20.11.2014 19:05 # +1
1) логи для статистики (перформанс, кол-во юзерей, время ответа, загрузка CPU, какие-то факты для OLAP кубов-репортов итд). Часть таких логов можно продолбать и аппроксимировать.
2) логи секьюрити (например логин пользователя в систему или транзакция -- перевод миллиарда долларов на счет). Вот такие логи я бы не рискнул по UDP без подтверждения доставки;)
bormand 20.11.2014 19:11 # 0
Анонимус 20.11.2014 19:14 # 0
bormand 20.11.2014 19:15 # 0
Анонимус 20.11.2014 19:15 # 0
bormand 20.11.2014 19:16 # 0
TCP гарантирует только порядок байт в потоке. Не более того.
Анонимус 20.11.2014 19:18 # 0
Это вполне гарантирует TCP.
Что неправильно?
bormand 20.11.2014 19:19 # 0
Гарантии TCP - порядок байт в потоке и их корректность.
Анонимус 20.11.2014 19:20 # 0
А UDP не поставит.
И кстати в случае порванного провода Вы никак не гарантируете.
bormand 20.11.2014 19:21 # 0
Ну не поставит же. А если и поставит - то только по таймауту. И не скажет, какие именно байты проёбаны. Один хрен свои подтверждения прикручивать придётся. И, в итоге, мы получим окно поверх окна.
> в случае порванного провода Вы никак не гарантируете
В том и суть. Что гарантии у систем на основе TCP и UDP будут примерно одинаковые. Только с TCP, в данном случае, больше ёбли.
Анонимус 20.11.2014 19:27 # 0
Значит, писун узнает что читун отвалился.
defecate-plusplus 20.11.2014 19:30 # 0
Анонимус 20.11.2014 19:32 # 0
bormand 20.11.2014 19:33 # 0
Вот! И тут-то TCP, вместо того, чтобы помогать, начинает втыкать нам палки в колёса.
Анонимус 20.11.2014 19:35 # 0
bormand 20.11.2014 19:44 # 0
Добавляем записи в "очередь" ограниченной длины. У каждой записи есть время переотправки (resend_time), ttl и priority. Поток отправляет записи с resend_time > now, при этом у записи увеличивается resend_time (по формуле, зависящей от ttl) и уменьшается ttl (если дошел до 0 - запись удаляется). При получении подтверждения соответствующие записи вычеркиваются из очереди. При переполнении очереди отбрасывается самая старая запись с priority <= приоритету вставляемой записи. Как-то так.
> а не over TCP
Потому, что буфера, таймауты и окна TCP тут будут только мешать (хотя, с другой стороны, на TCP мы получим лучший congestion control).
Анонимус 20.11.2014 19:48 # 0
bormand 20.11.2014 19:53 # 0
И зачем портить TCP, если можно улучшать UDP? :)
Анонимус 20.11.2014 19:54 # 0
bormand 20.11.2014 19:56 # 0
Ой ли?
Анонимус 20.11.2014 20:32 # 0
bormand 20.11.2014 19:31 # 0
Святая наивность... Если кабель выдрать у писуна - да, вернет, скорее всего. В остальных случаях - просто пообещает записать N байт и отложит в буфер до поры до времени.
Анонимус 20.11.2014 19:34 # 0
Ну хорошо, не сразу вернется, ОС какое-то время будет копить данные в буфере, потом на канальном уровне это будет хендлится (сетевуха будет пытаться что-то сделать итд). Но в конце концов -1 все-таки вернется же!
bormand 20.11.2014 19:35 # 0
Если не крутить настройки сокета - через 20-30 минут. Только это будет уже совсем другой write().
Анонимус 20.11.2014 19:39 # 0
Если например на роутере беда и пришел по ICMP "Destination unreachable" то всё равно ждать пол часа?)
А если пакеты летят вникуда и там дропаются то и правда ждать можно долго. Но кроме того есть настройки, как Вы правильно сказали.
Ну чудес не бывает же. Мы же не можем понять потерялся пакет навсегда или просто еще не пришел.
TarasB 22.11.2014 19:26 # 0
bormand 22.11.2014 19:31 # 0
Ну значит игра достаточно часто отправляла пакеты, и ICMP'шки хорошо пролезали...
А вот если выдрать кабель за каким-нибудь тупым коммутатором в локалке - скорее всего не узнают.
Анонимус 20.11.2014 19:31 # 0
О какой ебле идет речь? TCP вполне себе реализован на большинстве платформ, тут ничего не надо пилить.
Кроме того в TCP (ЕМНИП) ресивер может крутить окно и тем самым говорить посылальщику "быстрее-медленее", чтоб буфер не переполнился
bormand 20.11.2014 18:13 # 0
gost 22.11.2014 17:41 # 0
> XML
Блять.