← All posts tagged C

ArkanoiD

вопрос: а покажите мне портабельную функцию, которая по сокету выдаст имя интерфейса, на который он пришел?
hint: например, в линупсе для переадресованных iptables соединений getsockname уже даст вовсе не наш локальный адрес, а чорт знает что
hint2: существуют другие системы, кроме linux, solaris и *bsd.

ArkanoiD

есть смешная задачка: сделать функцию int generic_tunnel(int client_socket, int server_socket, int dynport_min, int dynport_max, int server_port, int nat) , которая бы открывала с помощью произвольного ядреного пакетного фильтра туннель, который бы ловил все приходящее с peername(client_socket) на некий порт на sockname(client_socket) в заданном динамическом диапазоне и перенаправлял на server_port на peername(server_socket). Ну и возвращала этот номер порта. Если с параметром NAT, то с адресной трансляцией на sockname(server_socket), если без, то без нее.

В чем засада: пакетный фильтр может быть произвольным: iptables, ipfilter, pf, ipfw, whatever.

Если вы знаете частное решение для какой-то реализации, ткните в него пальцем. Если вас читают люди, которые знают — порекомендуйте. Что все описано в соответствующих API я в курсе, просто не хочется вникать подробно в каждый конкретный случай, я так неделю провожусь со всеми виртуалками.

Призовая игра: придумайте, как реализовать коллбэк для сбора статистики по переданным байтам, когда соединение закроется (или отвалится по таймауту, если там UDP, например)