example - sys/socket.h c++



Определение, кто открыл сеанс TCP (1)

Всегда клиент делает активное соединение, отправляя SYN (на сервер). Поэтому, учитывая местный IP-адрес и номер порта, проверьте, есть ли его сокет прослушивания, используя следующую команду:

netstat --listening | grep given_ip:given_port

Если он не указан здесь, то он является клиентским сокетом, поэтому инициирует SYN . Если его там, то его прослушивающий сокет и, следовательно, он получил SYN .

Соответствующий код выглядит следующим образом:

system("netstat --listening | grep given_ip:given_port > tmp.txt");
int fd = open("tmp.txt", O_RDONLY);
char buf[100] ;
if(read(fd,buf,100)>0)
    printf("The socket has received a SYN!");
else
    printf("The socket has sent a SYN!");

РЕДАКТИРОВАТЬ:

Если вы считаете, что netstat имеет слабую скорость сканирования всех портов, то единственным способом достичь стабильности является открытие raw socket и установка его для приема всех TCP пакетов.

Обработайте только те пакеты, которые содержат SYN в них. Теперь сохраните оба source address:port и destination address:port на две таблицы. Тот, который является отправителем SYN и тот, который является получателем.

Теперь, когда вам задан порт и ip-адрес, сделайте scan по данным, хранящимся до сих пор. Вы также можете использовать STL map C++ для достижения более быстрых результатов.

Поскольку может быть много запросов, map может быстро заполняться, что делает поиск медленным. Я также прошу вас обработать пакеты FIN и на основе этого удалить соответствующие записи из таблицы.

Учитывая локальный IP-адрес и порт для установленного сеанса TCP, могу ли я выяснить, какая сторона отправила начальный SYN? То есть, была ли эта связь активно или пассивно открыта? Мне нужно что-то, что работает в C / C ++ в Linux. Хакерный способ может быть в socket () / listen () и поймать EADDRINUSE, но я надеялся на что-то более чистое. Я даже не уверен, отслеживает ли это ядро ​​после установки сеанса.

EDIT: Я также предпочел бы не звонить в netstat (или даже ss), поскольку оба они слишком медленны, при этом многие сокеты открыты. Этот код будет вызываться часто.





network-programming