c - 多次重用原始套接字或创建新套接字
问题描述
我正在编写一个类似 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;
}
解决方案
是的,您可以在多个线程甚至多个进程上重用套接字。内核确保正确处理对套接字的并发访问。
但是,您必须记住,更改套接字选项将影响使用此套接字的所有进程和线程。此外,到达套接字的数据包只能由一个线程/进程读取,它们不会重复。
推荐阅读
- ruby-on-rails - react 和 rails 中的 csrf
- asp.net-core - ASP-NET.core如何实现资源文件本地化?
- sql - SQL查询根据列分组获取总人数
- python - python Rock Paper Scissors项目中的函数调用问题
- azure - 如何在 azure ad 多租户 dotnet Web 应用程序中获取角色?
- html - 在 HTML CSS 中的图像上添加文本
- javascript - 如何在尚未渲染的元素中应用 css 类?
- jquery - 构建嵌套数组Jquery
- vue.js - Facebook 调试器未抓取 Nuxt 元标记
- python - 如何从 django ORM 中的连接表中获取列