【问题标题】:Problems implementing malloc correctly in C在 C 中正确实现 malloc 的问题
【发布时间】:2023-01-18 08:54:22
【问题描述】:

我正在从事一个包括服务器-客户端通信的项目。 我们的代码并非一直有效,有时它可以完美运行。但有时我们要么超时,要么我们的缓冲区不能正常工作。这就是我们要实现 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;
}

任何帮助表示赞赏! 最佳恩诺

【问题讨论】:

    标签: c sockets malloc


    【解决方案1】:

    resetBuffer(buffer); 失败,因为它尝试 strlen(buffer) 未初始化的数据。这调用未定义的行为(UB) 因为strlen() 需要一个指向 a 的指针细绳.

    反而:

    // resetBuffer(buffer);
    memset(buffer, 0, sizeof(char)* BUFFERSIZE);
    // or simply
    memset(buffer, 0, BUFFERSIZE);
    

    【讨论】:

      【解决方案2】:

      这个

      void resetBuffer(char* buffer){
         memset((buffer), '
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 2018-04-27
      • 2020-08-26
      • 2018-07-29
      相关资源
      最近更新 更多