重用原始套接字或多次创建新套接字

时间:2019-02-05 12:27:45

标签: c sockets

我正在编写一个类似于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 :(得分:1)

是的,您可以在多个线程甚至多个进程上重用套接字。内核确保对套接字的并发访问得到正确处理。

但是,您必须记住,更改套接字选项将影响使用此套接字的所有进程和线程。此外,到达套接字的数据包只能由一个线程/进程读取,不能重复。