Как создать пакет UDP?

Зомби-процесс, по сути, уже мертв. Единственное, что никто еще не признал его смерть, поэтому он продолжает занимать запись в таблице процессов, а также управляющий блок (структура, которую ядро Linux ведет для каждого потока в активности). Другие ресурсы, такие как обязательные блокировки на файлы, сегменты общей памяти, семафоры и т.д., возвращаются.

Вы не можете подать на них сигнал, потому что никто не может действовать по этому сигналу. Даже фатальные сигналы, такие как KILL, бесполезны, поскольку процесс уже завершил свое выполнение. Вы можете попробовать сами:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void)
{
    pid_t pid = fork();

    if (pid == -1)
        exit(-1);

    if (pid > 0) {
        //parent
        printf("[parent]: I'm the parent, the pid of my child is %i\n"
            "I'll start waiting for it in 10 seconds.\n", pid);
        sleep(10);
        int status;
        wait(&status);

        if (WIFSIGNALED(status)) {
            printf("[parent]: My child has died from a signal: %i\n", WTERMSIG(status));
        } else if (WIFEXITED(status)) {
            printf("[parent]: My child has died from natural death\n");
        } else {
            printf("[parent]: I don't know what happened to my child\n");
        }
    } else {
        //child
        printf("[child]: I'm dying soon, try to kill me.\n");
        sleep(5);
        printf("[child]: Dying now!\n");
    }

    return 0;
}

Здесь я запускаю процесс, который вилкуется и спит, ожидая своего ребенка. Ребенок ничего не делает, только немного спит. Вы можете убить дочерний процесс, когда он спит, или сразу после его выхода, чтобы увидеть разницу:

$ make zombie 
cc     zombie.c   -o zombie

$ ./zombie    
[parent]: I'm the parent, the pid of my child is 16693
I'll start waiting for it in 10 seconds.
[child]: I'm dying soon, try to kill me.
# Here, I did "kill -15 16693" in another console
[parent]: My child has died from a signal: 15

$ ./zombie
[parent]: I'm the parent, the pid of my child is 16717
I'll start waiting for it in 10 seconds.
[child]: I'm dying soon, try to kill me.
[child]: Dying now!
# Here, I did "kill -15 16717" in another console
[parent]: My child has died from natural death
15
24.11.2018, 11:36
2 ответа

Вы можете отправлять их в специальные псевдонимы Bash с перенаправлением.

Из справочных страниц Bash:

/dev/tcp/host/port If host is a valid hostname or Internet address, and port is an integer port number or service name, bash attempts to open the corresponding TCP socket.

/dev/udp/host/port If host is a valid hostname or Internet address, and port is an integer port number or service name, bash attempts to open the corresponding UDP socket.

Пакет UDP будет отправлен на адрес 192.168.2.11 на порт 8080 :

.
echo "This is a test" > /dev/udp/192.168.2.11/8080
16
27.01.2020, 19:49

Ваш пакет полностью действителен с точки зрения IP и UDP. Если вы развернете сведения о протоколе для Ethernet/IP/UDP в нижней панели Wireshark, вы увидите, что пакет успешно проанализирован.

Однако, поскольку он предназначен для порта 53, Wireshark пытается разобрать его как DNS-пакет, чего он не может сделать (, поскольку строка «это тест» не является допустимым DNS-запросом в соответствии с RFC 1035 спецификация ).

Если вы будете следовать спецификации по этой ссылке, вы сможете создать пакет, который действителен при анализе как запроса DNS. Если вы отправите пакет на другой порт, вы заметите, что Wireshark больше не будет анализировать его как DNS-запрос и, следовательно, не будет показывать это предупреждение.

41
27.01.2020, 19:49

Теги

Похожие вопросы