SYN_RECV - это состояние tcp-соединения во время three-handshake, означающее что сервер принял пакет с установленным флагом SYN (запрос на соединение), отправил SYN/SYN-ACK клиенту и ожидает от клиента пакет с флагом ACK.
Поскольку ACK от клиента (в нашем случае, от атакующего хоста) не приходит, то соединение висит до момента, пока оно не будет убито по таймауту. Пока такое соединение существует в системе - оно потребляет ресурсы, что может создать прецедент для замедления работы системы.
Таким образом, чтобы таких соединений не создавалось нужно отсеивать из них неугодные до того, как система выделит для них ресурсы. В Вашем случае, нужно фильтровать все входящие пакеты с установленным флагом SYN и дропать те из них, которые нас не устраивают. Легитимный пользователь не будет создавать по десятку соединений каждую секунду, а атакующий - будет.
Соответственно, Вам нужно выяснить закономерность (периодичность, количество запросов и т. п.), позволяющую отличить легитимный хост от атакующего конкретно в Вашем случае, и в соответствии с ней создать правила.
Если говорить обобщенно, то в Вашем случае, я думаю, проблему можно решить с помощью модуля recent в iptables. Уверен, его функционала Вам будет достаточно. Сможете обойтись несколькими правилами. Алгоритм следует применить примерно такой:
1. Сначала разрешаете входящий tcp-трафик по соединениям в состояниях ESTABLISHED и RELATED (модуль conntrack).
iptables -I INPUT 1 -p tcp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 80,443 --syn -m conntrack --ctstate NEW -m recent --name webtraffic --update --seconds 5 --hitcount 16 -j DROP
iptables -A INPUT -p tcp -m multiport --dports 80,443 --syn -m conntrack --ctstate NEW -j ACCEPT
net.ipv4.tcp_max_syn_backlog = 262144
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 20
Ну вы уж определитесь, что вы хотите, C, С++, C#, это 3 разных языка программирования, если C++ поддерживает библиотеки C, то C# это совсем другой язык программирования, C++/Cli в данном случае так же другой язык, который не имеет ничего общего с C# и позволяет генерировать управляемый код в C++.
Вообще я когда-то поставил Visual C++ 6.0, открыл сайт http://firststeps.ru и понеслось. Начал с туториалов, потом начал читать книги по C++. Страуструпа, Элджера, потом и до Александреску добрался.
А Керниган это C.
Ставьте Visual Studio 2013 Express и не мучайтесь (если под Win). К C++ Builder лучше вообще не прикасайтесь. CodeLite вообще IDE, а не компилятор. Предыдущие 2 идут со своими компиляторами. Ну и создавайте проекты консольных приложений.
Часто ответ можно найти здесь - http://builtwith.com/sbets.ru
В нашем случае вот что сервис выдал
<div id="i1"><div id="i2"><div id="i3"><div id="i4"></div></div></div></div>
<div id="info"></div>
var x, dt, dt2;
var iter = 100000;
dt = new Date();
for (var i = 0; i < iter; i++)
{
x = $("#i4").parent().parent();
}
dt2 = new Date();
$("#info").text(dt2 - dt);
dt = new Date();
for (var i = 0; i < iter; i++)
{
x = $("#i4").parents().get(2);
}
dt2 = new Date();
$("#info").text($("#info").text() + ":" + (dt2 - dt));
var x, dt, dt2;
var iter = 10000; /* <-- В 10 раз уменьшим, а то зависнем */
dt = new Date();
for (var i = 0; i < iter; i++)
{
$("#i4").text($("#i4").parent().parent().attr("id")); /* <-- Запишем id родителя в текст потомка */
}
dt2 = new Date();
$("#info").text(dt2 - dt);
dt = new Date();
for (var i = 0; i < iter; i++)
{
$("#i4").text($("#i4").parents().get(2).attr("id")); /* <-- Попробуем сделать то же самое */
}
dt2 = new Date();
$("#info").text($("#info").text() + " " + (dt2 - dt));