C 服务器只能接受n个客户端

C 服务器只能接受n个客户端,c,client-server,server,signal-handling,C,Client Server,Server,Signal Handling,我正在使用C语言编写一个服务器代码,该代码必须只接受少量的客户端,如果有额外的客户端到达,服务器将使该客户端等待,直到一个旧客户端终止 比如说 服务器只能接受10个客户机,如果新客户机到达,服务器将让该客户机等待10个客户机中的一个终止,然后他就可以得到服务 我知道我必须使用signal函数,在listen函数之后,在accept和创建一个计算客户端数量的值之前,但我不知道如何正确使用它 有谁能给我一个提示或简单的例子吗 谢谢,,,,,,无需使用信号。例如: #include <stdio

我正在使用C语言编写一个服务器代码,该代码必须只接受少量的客户端,如果有额外的客户端到达,服务器将使该客户端等待,直到一个旧客户端终止

比如说 服务器只能接受10个客户机,如果新客户机到达,服务器将让该客户机等待10个客户机中的一个终止,然后他就可以得到服务

我知道我必须使用signal函数,在listen函数之后,在accept和创建一个计算客户端数量的值之前,但我不知道如何正确使用它

有谁能给我一个提示或简单的例子吗

谢谢,,,,,,

无需使用信号。例如:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

main()
{
    int s = socket(PF_INET, SOCK_STREAM, 0);    // server socket
    if (s            == -1) return perror("socket"), 1;
    if (listen(s, 0) == -1) return perror("listen"), 1;
    const int n = 10;   // number of clients allowed to be served
    fd_set fds, rfds;
    FD_ZERO(&fds);
    FD_SET(s, &fds);    // initially, set of sockets holds server
    int nfds = s+1, fd, clients = 0;
    while (rfds = fds, select(nfds, &rfds, NULL, NULL, NULL) > 0)
        for (fd = 0; fd < nfds; ++fd)
            if (FD_ISSET(fd, &rfds))    // see which sockets of set are ready
                if (fd == s)            // is it the server socket?
                {   // yes, so it is a client's connection request
                    printf("new client request ");
                    struct sockaddr_in sa = { AF_INET, 0, INADDR_ANY };
                    socklen_t sal = sizeof sa;
                    int c = accept(s, (struct sockaddr *)&sa, &sal);
                    if (c == -1) return perror("accept"), 1;
                    FD_SET(c, &fds); if (nfds <= c) nfds = c+1; // add client
                    printf("accepted (fd=%d) # clients now %d\n", c, ++clients);
                    if (clients == n)   // allowed number hit?
                        puts("Further client requests will be ignored."),
                        FD_CLR(s, &fds);    // don't watch server now
                }
                else
                {   // this is a client's message or termination
                    printf("client fd=%d: ", fd);
                    char buf[BUFSIZ];
                    size_t count = read(fd, buf, sizeof buf);
                    if (count > 0) fwrite(buf, 1, count, stdout);
                    else
                    {   // no more data from client, so close the connection
                        close(fd);
                        FD_CLR(fd, &fds);   // remove client from watch set
                        printf("closed, # clients now %d\n", --clients);
                        if (clients == n-1) // went just below allowed number?
                            FD_SET(s, &fds),    // watch server again
                            puts("New client requests will be accepted again.");
                    }
                }
    return perror("select"), 1;
}

注意:这个程序绑定到一个随机空闲端口,你可以通过e。Gnetstat-tlp。当然,您也可以绑定到特定的地址和端口。在任何情况下,你都可以用e。Gnc主机名端口。

您以前是否尝试过…?查找“多线程”和pthreads,特别是让客户端等待。。。怎样到底什么被称为在这里等待?@SouravGhosh服务器会阻止它client@Ali再次,如何阻止?拒绝然后您可以使用listen中的backlog来实现这一点。看。