Повторно используйте сокет Raw или создайте новый сокет много раз - PullRequest
0 голосов
/ 05 февраля 2019

Я кодирую небольшую nmap-подобную программу и фактически создаю сокет для каждого пакета, который создаю вручную.Даже если он отправляет tcp пакеты, я не хочу проводить tcp сессию (я нюхаю ответы и не волнуюсь о том, что произойдет после).Должен ли я объявить только один сокет и повторно использовать его для каждого пакета.

Безопасен ли этот поток для повторного использования сокета?

Спасибо.

int        send_raw_packet(s_raw *data, size_t data_size)
{

    struct sockaddr_in       sin = { .sin_addr.s_addr = 1 };
    int   socket_fd;
    int    sendto_res = -1;
    char    interface[IFNAMSIZ] = "enp0s3"; // Trying things there
    socket_fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);

    if (setsockopt(socket_fd, SOL_SOCKET, SO_BINDTODEVICE, interface, ft_strlen(interface)) == -1)
        perror("setsockopt: ");

    if (socket_fd == -1)
    {
        perror("Socket: ");
    }
    else
    {
       sendto_res = sendto(socket_fd, data, data_size, 0, (struct sockaddr *)&sin, sizeof sin);
        if (sendto_res == -1)
            perror("\033[091msendto :\033[0m");
        close(socket_fd);
    }
    return sendto_res;
}

1 Ответ

0 голосов
/ 05 февраля 2019

Да, вы можете повторно использовать сокет в нескольких потоках или даже в нескольких процессах.Ядро обеспечивает правильную обработку одновременного доступа к сокету.

Однако следует помнить, что изменение параметров сокета повлияет на все процессы и потоки, которые используют этот сокет.Кроме того, пакеты, поступающие в сокет, могут быть прочитаны только одним потоком / процессом, они не дублируются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...