Select 在 TCP 套接字和 UDP 套接字之间(c)

Select between TCP socket and UDP socket(c)

我正在用 c 语言制作一个服务器,它既处理管理员更改服务器配置的 tcp 连接,又处理多个客户端的 udp 连接

这是我的代码:

    struct sockaddr_in si_minhaTCP,si_minhaUDP, si_outra;
    int nready, maxfdp1;
    int fdTcp;
    int fdUdp;
    fd_set rset;
    if (argc != 4) {
    printf("server {client port(udp)} {admin port(tcp)} {registry file path}\n");
    exit(-1);
  }

    fdTcp = socket(AF_INET, SOCK_STREAM, 0);
    bzero(&si_minhaTCP, sizeof(si_minhaTCP));
    si_minhaTCP.sin_family = AF_INET;
    si_minhaTCP.sin_addr.s_addr = htonl(INADDR_ANY);
    si_minhaTCP.sin_port = htons((short) atoi(argv[2]));
    bind(fdTcp, (struct sockaddr*)&si_minhaTCP, sizeof(si_minhaTCP));
    listen(fdTcp, 10);


        
    fdUdp = socket(AF_INET, SOCK_DGRAM, 0);
    si_minhaUDP.sin_family = AF_INET;
    si_minhaUDP.sin_addr.s_addr = htonl(INADDR_ANY);
    si_minhaUDP.sin_port = htons((short) atoi(argv[1]));
    bind(fdUdp, (struct sockaddr*)&si_minhaUDP, sizeof(si_minhaUDP));


    FD_ZERO(&rset);

    maxfdp1 = max(fdTcp, fdUdp) + 1;
    for (;;)
    {
      FD_SET(fdTcp, &rset);
      FD_SET(fdUdp, &rset);
      // select the ready descriptor

      nready = select(maxfdp1, &rset, NULL, NULL, NULL);
      if (FD_ISSET(fdTcp, &rset))
      {

          //handle tcp connection
      }
      if (FD_ISSET(fdUdp, &rset))
      {
          //handle udp connection
      }

    }
           

当我 运行 此代码并尝试使用 udp 客户端对其进行测试时,它没有执行任何操作

但是,如果您 运行 程序作为 root 并且没有其他程序 运行ning,您可以使用 1024 以下的端口,这些程序已经使用该端口...