【问题标题】:C client doesn't receive from serverC客户端没有从服务器接收
【发布时间】:2022-01-09 22:27:37
【问题描述】:

我用select() 做了一个简单的服务器客户端程序,但问题是客户端没有收到欢迎消息。我之前在没有select() 的情况下做了几次,它工作了,但是突然之间它不想在使用select() 时工作。我做错了什么?

服务器:

#define MAX_CLIENTS 10

int main()
{
    system("clear");
    printf("***SERVER STARTED***\n");

    int master_socket = socket(AF_INET, SOCK_STREAM, 0);
    fd_set fdsForReading;

    struct sockaddr_in address;
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8888);
    bind(master_socket, (struct sockaddr *)&address, sizeof(address));
    listen(master_socket, 3);

    while (1)
    {
        FD_ZERO(&fdsForReading);               // Clearing the file descriptor set
        FD_SET(master_socket, &fdsForReading); // Add master_socket to file descriptor set

        printf("Monitoring for connections...\n");
        select(master_socket + 1, &fdsForReading, NULL, NULL, NULL);

        int accepted_socket = accept(master_socket, (struct sockaddr *)&address, sizeof(address));
        printf("[+] New connection accepted\n");

        char buffer[125] = "Welcome to my server";
        send(accepted_socket, buffer, sizeof(buffer), 0);

        printf("End of while loop\n");
    }
}

客户:

int main()
{
    system("clear");
    int clientSocket = socket(AF_INET, SOCK_STREAM, 0), x;

    struct sockaddr_in serverAddress;
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_port = htons(8888);
    serverAddress.sin_addr.s_addr = INADDR_ANY;

    connect(clientSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress));

    char serverResponse[125];
    recv(clientSocket, &serverResponse, sizeof(serverResponse), 0);
    printf("test: %s\n", serverResponse);

    scanf("%d", &x);

    close(clientSocket);
}

【问题讨论】:

    标签: c sockets select


    【解决方案1】:
    • 您不检查错误。总是这样做!
    • &serverResponse 应该是 serverResponse
    • recv 收到的字符可能少于您发送的字符,因此您应该检查收到的字符数,并可能将收到的内容连接起来,直到收到完整的消息。
    • 您收到的内容通常不会以 null 结尾,因此如果您收到的内容要与需要以 null 结尾的字符串的函数(如 printf("%s", ...)一起使用,则需要添加 \0。在您的情况下,您实际上发送125chars,即使字符串短得多。你可能不应该那样做。这将发送字符串 + 空终止字符:
      send(accepted_socket, buffer, strlen(buffer) + 1, 0);
      
    • accept 的第三个参数应该是 socklen_t * - 而不是 sizeof(address)。例子:
      socklen_t addrlen = sizeof address;
      int accepted_socket = accept(master_socket, (struct sockaddr *)&address, &addrlen);
      

    通过这些更改,如果没有发生错误,客户端将收到很好的问候语 - 但是当您添加错误检查时,您会看到在这种情况下问题出在哪里。

    【讨论】:

    • @hasan 很高兴它有帮助!不客气!
    猜你喜欢
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 2013-05-18
    • 2019-01-09
    相关资源
    最近更新 更多