You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

客户端-服务器应用中使用malloc分配缓冲区的问题求助

客户端-服务器通信项目缓冲区问题求助

我正在开发一个包含客户端-服务器通信的项目。原代码并非始终正常运行,有时能完美工作,但有时会出现超时或缓冲区异常的情况。因此我尝试改用malloc()分配缓冲区,但修改后的代码完全无法运行。以下是使用malloc()前后的代码:

使用malloc()前的代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <stdbool.h>
#include <unistd.h>

#define BUFFERSIZE 1024                                              
#define VERSION "VERSION 3.4\n"

#include "functions.h"

char buffer[BUFFERSIZE];

void resetBuffer(char *buffer) {
    memset((buffer), '\0', strlen(buffer));
}

void receiveAnswer(int sock) {
    resetBuffer(buffer);
    size_t length;
    bool x = true;

    while (x) {
        recv(sock, buffer, sizeof(buffer), 0);
        length = strlen(buffer);
        if (buffer[length-1]  == '\n') {
            x = false;
        }
    }

    if (buffer[0] == '-') {
        printf("Error: %s", buffer);
    } else {
        printf("%s\n ", buffer);
    }
}

void sendResponse(int sock, char *message) {
    resetBuffer(buffer);
    strcpy(buffer, message);

    bool x = true;
    size_t length;

    while(x) {
        send(sock, buffer, strlen(buffer), 0);
        length = strlen(buffer);
        if (buffer[length - 1] == '\n') {
            x = false;
        }
    }

    printf("Client: %s\n", buffer);
}

int performConnection(int sock, char *gameID) {
    receiveAnswer(sock);
    sleep(1);
    receiveAnswer(sock);
    sleep(1);
    sendResponse(sock, VERSION);
    sleep(1);
    receiveAnswer(sock);
    sleep(1);
    sendResponse(sock, gameID);
    sleep(1);
    receiveAnswer(sock);
    sleep(1);
    sendResponse(sock, "PLAYER \n");
    sleep(1);
    receiveAnswer(sock);

    resetBuffer(buffer);

    return 0;
}

使用malloc()后的代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <stdbool.h>
#include <unistd.h>

#define BUFFERSIZE 1024
#define VERSION "VERSION 3.4\n"

#include "functions.h"

char *buffer;

void resetBuffer(char *buffer) {
    memset((buffer), '\0', strlen(buffer));
}

void receiveAnswer(int sock) {
    resetBuffer(buffer);
    size_t length;
    bool x = true;

    while (x) {
        recv(sock, buffer, sizeof(buffer), 0);
        length = strlen(buffer);
        if (buffer[length-1] == '\n') {
            x = false;
        }
    }

    if (buffer[0] == '-') {
        printf("Error: %s", buffer);
    } else {
        printf("%s\n ", buffer);
    }
}

void sendResponse(int sock, char *message) {
    resetBuffer(buffer);
    strcpy(buffer, message);

    bool x = true;
    size_t length;

    while (x) {
        send(sock, buffer, strlen(buffer), 0);
        length = strlen(buffer);
        if (buffer[length - 1] == '\n') {
            x = false;
        }
    }

    printf("Client: %s\n", buffer);
}

int performConnection(int sock, char *gameID) {
    buffer = (char *)malloc(sizeof(char) * BUFFERSIZE);
    receiveAnswer(sock);
    sleep(1);
    receiveAnswer(sock);
    sleep(1);
    sendResponse(sock, VERSION);
    sleep(1);
    receiveAnswer(sock);
    sleep(1);
    sendResponse(sock, gameID);
    sleep(1);
    receiveAnswer(sock);
    sleep(1);
    sendResponse(sock, "PLAYER \n");
    sleep(1);
    receiveAnswer(sock);

    resetBuffer(buffer);
    free(buffer);
    return 0;
}

恳请各位提供帮助!


内容的提问来源于Stack Exchange,提问作者Enno Mühlbauer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:35:31