singlepost

Очередь UDP пакетов << На главную или назад  

В общем, мне нужно сделать что-то по типу цепочечной обработки пакетов, приходящих на один порт. Есть две программы A и B, B не знает о существовании A, хочется сделать так, чтобы сначала пакет читался программой A, затем тот же пакет – B, если B не запущена, то пакет удаляется из пула. Что-то наподобие цепочки хуков, только не для виндовсковских сообщений, а для udp пакетов. Желательно без драйверов-фильтров, т.е. документированный юзермод.
Прошу помощи в идейном плане.

8 ответов в теме “Очередь UDP пакетов”

  1. 8
    Vitaly Martynovich ответил:

    Там то оно так, ну а что если B совсем не запущено? Да и думаю простого сплайсинга в этом случае хватит, если запущено все-таки..
    Проще наверное дров написать да?

  2. 7
    Леонид Максимов ответил:

    тогда подложите программе B липовую либу собственного приготовления, в которой нужные функции будут перегружены, а остальные перенаправлены к стандартной. большого труда составить не должно.

  3. 6
    Vitaly Martynovich ответил:

    Я хотел что-то вроде юзермодного фильтра на заданный порт ^_^

  4. 5
    Леонид Максимов ответил:

    то есть нужно, чтобы две программы, находящиеся в полном неведении друг о друге, получали одинаковые датаграммы с общего порта, не портя их. куда проще случай, когда A пожет проконтролировать наличие B, что, я полагаю, возможно и в приведенной задаче.

  5. 4
    Vitaly Martynovich ответил:

    Да,
    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, но ведь если программа не запущена, то я тогда буду читать всегда один и тот же пакет..

  6. 3
    Леонид Максимов ответил:

    а вы сможете забиндиться своей програмой A на порт, который уже занят B?

  7. 2
    Vitaly Martynovich ответил:

    Я знаком с самим механизмом. Мне совсем точно выразился.. Шлет пакеты программа B, запущенная на удаленном компьютере. Хотелось бы чтобы A, если она запущена, могла прочитать пакет и переправить его дальше, в очередь. Что-то наподобие сетевого фильтра, только в юзермоде..

  8. 1
    Дмитрий Щербаков ответил:

    Для идейной помощи вы должны понимать что елси UDP пакет который был послан куда то, удалится из очереди если хост не доступен, а если доступен то просто примется, т.к. это udp(это проискохид автоматически). Далее, не совсем точная формулировка – пакеты то кто шлёт? Программа "А"? или же "А" выступет как дальнейший транслятор данных? И минус данной реализации – вы должны осознавать, что чем больше будет таких трансляторов в цепочке, тем больше будут потери данных в конечном приёмнике…

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.