无法绑定超过 1021 个端口
Unable to bind more than 1021 ports
>我正在尝试绑定所有 65535 个 TCP 端口,但实际上只有 1021 个 nmap(以 root 身份运行时)。如果不以 root 身份运行,1000-60994 中的数千个偶尔会出现在 nmap 上。结果反映在网络统计中。我使用的是完全修补的 Arch Linux。我正在使用非阻塞接受而不是生成 65535 个线程。
nmap -p 1-65535 localhost
和代码:
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
void open_tcp(uint16_t port)
{
static int sockfds[UINT16_MAX] = { 0 };
struct sockaddr_in serv_addr, cli_addr;
int cli_len;
int index = port - 1;
sockfds[index] = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(port);
bind(sockfds[index], (struct sockaddr *) &serv_addr, sizeof(serv_addr));
listen(sockfds[index], 5);
fcntl(sockfds[index], F_SETFL, fcntl(sockfds[index], F_GETFL, 0) | O_NONBLOCK);
cli_len = sizeof(cli_addr);
accept(sockfds[index], (struct sockaddr *) &cli_addr, &cli_len);
}
int main()
{
uint16_t i;
for (i = 1; i <= UINT16_MAX; ++i)
{
open_tcp(i);
}
for (;;) {}
return 0;
}
这里缺少什么才能正确绑定所有端口?
您可能增加了打开文件的最大数量。在调用程序之前尝试对其进行修改:
ulimit -n 66000
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 视觉studo 2019中的漫画和静态/动态绑定
- 将自由函数绑定为类成员函数
- 将常量指针引用绑定到非常量指针
- 在派生类中绑定非静态模板化成员函数
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 在 openGL 中多次绑定缓冲区
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 使用结构化绑定'Reflection'
- 为什么 std::绑定错误参数可以成功?
- 如何绑定 C++ gRPC 客户端的网络接口
- 在 openmp 中,omp_get_thread_num是否绑定到物理线程?
- C++绑定(已弃用)
- 运行时错误:引用绑定到类型为"int"的空指针
- 有没有办法将重载的类函数绑定到函数对象?
- 无法绑定超过 1021 个端口