首页 > 解决方案 > 多次重用原始套接字或创建新套接字

问题描述

我正在编写一个类似 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;
}

标签: csockets

解决方案


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

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


推荐阅读