我正在编写一个类似于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;
}
答案 0 :(得分:1)
是的,您可以在多个线程甚至多个进程上重用套接字。内核确保对套接字的并发访问得到正确处理。
但是,您必须记住,更改套接字选项将影响使用此套接字的所有进程和线程。此外,到达套接字的数据包只能由一个线程/进程读取,不能重复。