c 端口侦听器客户端在收到 1 条消息后断开连接

c port listener client disconnects after 1 message

我确实创建了一个侦听端口并在终端上打印消息的程序。

我的问题是,我想通过 telnet (telnet localhost 1337) 连接到我的服务器,它工作正常。然后我在端口上监听,它也工作正常,但循环没有执行,我确实从我的 telnet 收到这条消息:

┌──(sourcecodeengineer㉿kali)-[~]
└─$ telnet localhost 1337                                                                                     1 ⨯
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
a
Connection closed by foreign host.

我想在端口上监听,但我确实收到了一条我也实现了的“/shutdown”消息。

这将是我这次尝试的代码:

#include <stdio.h>     // perror, printf
#include <stdlib.h>    // exit, atoi
#include <unistd.h>    // read, write, close
#include <arpa/inet.h> // sockaddr_in, AF_INET, SOCK_STREAM, INADDR_ANY, socket etc...
#include <string.h>    // memset, strcmp


// server program, client program can be found at my Github Repo
int main(int argc, char const *argv[])
{
    int serverFd, clientFd;
    struct sockaddr_in server, client;
    socklen_t len;

    // default port if no port is given to listen on!
    int port = 1337;

    // buffer 
    char buffer[BUFSIZ];

    if (argc == 2)
    {
        port = atoi(argv[1]);
    }

    serverFd = socket(AF_INET, SOCK_STREAM, 0);

    if (serverFd < 0)
    {
        perror("Cannot create socket");
        exit(1);
    }

    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(port);

    len = sizeof(server);

    if (bind(serverFd, (struct sockaddr *)&server, len) < 0)
    {
        perror("Cannot bind socket");
        exit(2);
    }

    if (listen(serverFd, 10) < 0)
    {
        perror("Listen error");
        exit(3);
    } else {
        printf("Listening on port %d.\n", port);
    }
    
    while (1)
    {
        len = sizeof(client);

        if ((clientFd = accept(serverFd, (struct sockaddr *)&client, &len)) < 0)
        {
            perror("accept error");
            exit(4);
        }

        memset(buffer, 0, sizeof(buffer));

        int size = read(clientFd, buffer, sizeof(buffer));

        if (size < 0)
        {
            perror("read error");
            exit(5);
        }

        if (strcmp(buffer, "/shutdown")){
            printf("Shutting down\n");
            close(clientFd);
            break;
        } else {
            printf("Echo: %s\n", buffer);
        }
        
    }

    close(serverFd);

    return EXIT_SUCCESS;
}

有没有一个很好的方法来实现一个行为,这样当更多的客户端连接到我的端口时,我一次只接受其中的一个并等待它们断开连接(telnet -> (CTRL+5 ))?

问题是

if (strcmp(buffer, "/shutdown"))
如果缓冲区 等于“/shutdown”,则

为真,因此您的侦听器在第一次读取后终止。 因为 strcmp() 在我看来 return 不是一个布尔值,所以永远不要写

if (strcmp(...))

if (!strcmp( ... ))

但是 - 在你的情况下 -

if (strcmp( ... ) == 0)