fishhh 发表于 2023-5-15 21:20:31

端口

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

假设我电脑性能最够的情况下,我开65536个应用
端口不复用,吧端口号全占了,这时在开应用会怎样{:10_256:}

歌者文明清理员 发表于 2023-5-15 21:28:42

不知道

小甲鱼的二师兄 发表于 2023-5-15 22:57:52

端口被占了就不可用了

wp231957 发表于 2023-5-16 09:40:28

我8G内存开了300个浏览器窗口就基本上 啥也干不了了   和崩溃没啥区别

dolly_yos2 发表于 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;
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 = socket(AF_INET, SOCK_STREAM, 0);
    int ret = bind(fds, (struct sockaddr *)&address, sizeof(address));
    if (ret == 0) {
      printf("bind (fd)%d -> (port)%d\n", fds, i);
    } else {
      printf("failed to bind to (port)%d: %s\n", i, strerror(errno));
      close(fds);
      fds = -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 != -1) {
      close(fds);
    }
}
return 0;
}
页: [1]
查看完整版本: 端口