无法绑定超过 1021 个端口

Unable to bind more than 1021 ports

本文关键字:1021 绑定      更新时间:2023-10-16

>我正在尝试绑定所有 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