鱼C论坛

 找回密码
 立即注册
查看: 2330|回复: 4

端口

[复制链接]
发表于 2023-5-15 21:20:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 fishhh 于 2023-5-15 21:21 编辑

假设我电脑性能最够的情况下,我开65536个应用[doge]
端口不复用,吧端口号全占了,这时在开应用会怎样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-15 21:28:42 | 显示全部楼层
不知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-15 22:57:52 From FishC Mobile | 显示全部楼层
端口被占了就不可用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-16 09:40:28 | 显示全部楼层
我8G内存  开了300个浏览器窗口  就基本上 啥也干不了了   和崩溃没啥区别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-16 11:02:31 | 显示全部楼层
不需要开65535个“应用”,一个进程就够用了,想知道具体会发生什么可以直接自己试试,这是 Linux 上能运行的代码,编译要链接 libcap(-lcap),需要 root 运行或者给 CAP_NET_BIND_SERVICE
#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/capability.h>
#include <sys/socket.h>
#include <unistd.h>
static bool check_capability() {
  cap_t capabilities = cap_get_proc();
  bool result = false;
  do {
    if (capabilities == NULL) {
      perror("cap_get_proc");
      exit(EXIT_FAILURE);
    }
    cap_flag_value_t value;
    if (cap_get_flag(capabilities, CAP_NET_BIND_SERVICE, CAP_EFFECTIVE, &value) == -1) {
      perror("cap_get_flag");
      exit(EXIT_FAILURE);
    }
    if (value == CAP_SET) {
      result = true;
      break;
    }
    if (cap_get_flag(capabilities, CAP_NET_BIND_SERVICE, CAP_PERMITTED, &value) == -1) {
      perror("cap_get_flag");
      exit(EXIT_FAILURE);
    }
    if (value == CAP_CLEAR) {
      result = false;
      break;
    }
    cap_value_t caps[] = {CAP_NET_BIND_SERVICE};
    if (cap_set_flag(capabilities, CAP_EFFECTIVE, 1, caps, CAP_SET) == -1) {
      perror("cap_set_flag");
      exit(EXIT_FAILURE);
    }
    if (cap_set_proc(capabilities) == -1) {
      perror("cap_set_proc");
      exit(EXIT_FAILURE);
    }
    result = true;
  } while (false);
  cap_free(capabilities);
  return result;
}
static void deal_with_permission() {
  if (geteuid() == 0) {
    return;
  }
  if (check_capability() == false) {
  }
  if (check_capability() == false) {
    fprintf(stderr, "permission denied.\n");
    exit(EXIT_FAILURE);
  }
}
static void handler(int sig) { return; }
int main() {
  deal_with_permission();
  int fds[UINT16_MAX + 1];
  memset(fds, -1, sizeof(fds));
  struct sockaddr_in address = {.sin_family = AF_INET, .sin_port = 0, .sin_addr = {inet_addr("127.0.0.1")}};
  for (uint16_t i = 1; i != 0; i++) {
    address.sin_port = htons(i);
    fds[i] = socket(AF_INET, SOCK_STREAM, 0);
    int ret = bind(fds[i], (struct sockaddr *)&address, sizeof(address));
    if (ret == 0) {
      printf("bind (fd)%d -> (port)%d\n", fds[i], i);
    } else {
      printf("failed to bind to (port)%d: %s\n", i, strerror(errno));
      close(fds[i]);
      fds[i] = -1;
    }
  }
  signal(SIGINT, handler);
  printf("signal me (pid=%d) with SIGINT to cleanup, waiting...\n", getpid());
  pause();
  for (uint16_t i = 1; i != 0; i++) {
    if (fds[i] != -1) {
      close(fds[i]);
    }
  }
  return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 23:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表