В общем, мне нужно сделать что-то по типу цепочечной обработки пакетов, приходящих на один порт. Есть две программы A и B, B не знает о существовании A, хочется сделать так, чтобы сначала пакет читался программой A, затем тот же пакет – B, если B не запущена, то пакет удаляется из пула. Что-то наподобие цепочки хуков, только не для виндовсковских сообщений, а для udp пакетов. Желательно без драйверов-фильтров, т.е. документированный юзермод.
Прошу помощи в идейном плане.
20 декабря 2008 в 13:03
Там то оно так, ну а что если B совсем не запущено? Да и думаю простого сплайсинга в этом случае хватит, если запущено все-таки..
Проще наверное дров написать да?
19 декабря 2008 в 21:01
тогда подложите программе B липовую либу собственного приготовления, в которой нужные функции будут перегружены, а остальные перенаправлены к стандартной. большого труда составить не должно.
19 декабря 2008 в 15:04
Я хотел что-то вроде юзермодного фильтра на заданный порт ^_^
19 декабря 2008 в 1:01
то есть нужно, чтобы две программы, находящиеся в полном неведении друг о друге, получали одинаковые датаграммы с общего порта, не портя их. куда проще случай, когда A пожет проконтролировать наличие B, что, я полагаю, возможно и в приведенной задаче.
18 декабря 2008 в 16:02
Да,
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (s==INVALID_SOCKET)
msg("Err while get socket");
setsockopt(s,SOL_SOCKET,SO_REUSEADDR, (char*)&soval, sizeof(BOOL));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = 0;
sin.sin_port = htons(port);
if (bind(s, (LPSOCKADDR)&sin, sizeof (sin))!=0)
msg("Err while binding");
Суть тут в использовании SO_REUSEADDR, об этом есть в msdn. Проблемы начинаются когда я забираю пакет:
norb = recvfrom(s, buf, 512, 0, from, d);
Я думал над использованием флага MSG_PEEK, но ведь если программа не запущена, то я тогда буду читать всегда один и тот же пакет..
18 декабря 2008 в 1:01
а вы сможете забиндиться своей програмой A на порт, который уже занят B?
17 декабря 2008 в 10:03
Я знаком с самим механизмом. Мне совсем точно выразился.. Шлет пакеты программа B, запущенная на удаленном компьютере. Хотелось бы чтобы A, если она запущена, могла прочитать пакет и переправить его дальше, в очередь. Что-то наподобие сетевого фильтра, только в юзермоде..
16 декабря 2008 в 22:03
Для идейной помощи вы должны понимать что елси UDP пакет который был послан куда то, удалится из очереди если хост не доступен, а если доступен то просто примется, т.к. это udp(это проискохид автоматически). Далее, не совсем точная формулировка – пакеты то кто шлёт? Программа "А"? или же "А" выступет как дальнейший транслятор данных? И минус данной реализации – вы должны осознавать, что чем больше будет таких трансляторов в цепочке, тем больше будут потери данных в конечном приёмнике…