重复使用原始套接字或创建一个新的套接字多次

问题描述 投票:0回答:1

我编码小的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;
}
c sockets
1个回答
1
投票

是的,你可以在多个线程甚至几个进程重用插座。内核可以确保,即到插座的并发访问得到妥善处理。

但是,你要记住,改变套接字选项将影响到所有进程和线程,它使用这个插座。此外,到达插座上的数据包只能由一个线程/进程看,他们不重复。

© www.soinside.com 2019 - 2024. All rights reserved.