C:free() 无效的下一个大小(快速)



我看到很少有相同问题的主题,但我仍然无法解决我的问题。所以这是我的代码 - 使用 XOR 加密的 C 套接字编程

当服务器和客户端连接时:- 用户发送消息,例如:你好- 服务器响应,例如:(服务器(:你好(用户说什么(

我在服务器的代码中得到这个错误,函数句柄客户端(..(

谢谢对不起,我的英语不好:|

server.c

/**
* Load libraries
**/
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "xor.h"
/**
* Define functions
**/
void handleError(char errorMessage[]);
void handleClient(int clientSocket);
void closeSocket(int serverSocket);
/**
* Define global variables
**/
int serverSocket;
/**
* Define constants
**/
#define DEFAULT_PORT 1213
#define QUEUE_LIMIT 10
#define BUFFER_LEN 64
/**
* Main function
**/
int main(int argc, char *argv[])
{
    printf("------------SERVER------------n");
    int clientSocket;
    struct sockaddr_in serverAddr;
    struct sockaddr_in clientAddr;
    unsigned short serverPort;
    unsigned int clientLen;
    if(argc != 2) {
        printf("Wrong argument!n");
        exit(1);    
    }
    serverPort = atoi(argv[1]);
    if((serverSocket = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
        handleError("socket() failn");
    }
    memset(&serverAddr, 0, sizeof(serverAddr));
    serverAddr.sin_family = AF_UNIX;
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serverAddr.sin_port = htons(serverPort);
    if(bind(serverSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr)) < 0) {
        handleError("bind() failn");
    }
    if(listen(serverSocket, QUEUE_LIMIT) < 0) {
        handleError("listen() failn"); 
    }
    clientLen = sizeof(clientAddr);
    if((clientSocket = accept(serverSocket, (struct sockaddr *) &clientAddr, &clientLen)) < 0) {
        handleError("accept() failn");     
    } else {
        handleClient(clientSocket);
    }
    return 0;
}
/**
* Display error message
* @param char message
**/
void handleError(char errorMessage[]) 
{
    printf("ERROR: %s", errorMessage);
    closeSocket(serverSocket);
    exit(1);
}
/**
* Handle client connection
* @param int client socket
**/
void handleClient(int clientSocket)
{
    char *buffer = malloc(BUFFER_LEN+1);
    char *key = "123456";
    char pre[BUFFER_LEN];
    while(clientSocket > 0) {
        if(recv(clientSocket, buffer, BUFFER_LEN, 0) > 0) {
            buffer = xor_decrypt(key, buffer);
            printf(">> User %d: %s", clientSocket, buffer);
            strcpy(pre, "(Server): ");
            strcat(pre, buffer);
            strcpy(buffer, pre);
            if(send(clientSocket, xor_encrypt(key, buffer), BUFFER_LEN, 0) < 0) {
                printf("send() failn");
                break;      
            }   
            strcpy(buffer, "");
            free(buffer);
            buffer = malloc(BUFFER_LEN+1);
        }
    }
    free(buffer);
    closeSocket(clientSocket);
}
/**
* Close socket
* @param socketid sockid that opened
*/
void closeSocket(int socket)
{
    int status = shutdown(socket, SHUT_RDWR);
    switch(status) {
        case 0:
            printf("Socket close successful!n");
            break;
        case -1:
            printf("Can't close socket!n");
            break;
        default:
            printf("shutdown() failn");
            break;
    }
}

//xor.c

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "xor.h"
char *xor_encrypt(const char *key, char *string) 
{   
    int lenStr = strlen(string);
    int lenKey = strlen(key);
    char *encrypted = malloc(lenStr + 1);
    int i;
    for(i = 0; i < lenStr; i++) {
        encrypted[i] = string[i]^key[i % lenKey];
    }
    return encrypted;
}
char *xor_decrypt(const char *key, char *string) {
    return xor_encrypt(key, string);
}   

运行

我解决了我的问题

P/s:有人用这个代码回答我的问题,但他删除了他的答案! @@所以谢谢你的回答!!

int lenStr = strlen(string);
int lenKey = strlen(key);

int lenStr = strlen(string) + 1;
int lenKey = strlen(key) + 1;

在这段代码中:

char *xor_encrypt(const char *key, char *string) 
{   
    int lenStr = strlen(string);
    int lenKey = strlen(key);
    char *encrypted = malloc(lenStr + 1);
    int i;
    for(i = 0; i < lenStr; i++) {
        encrypted[i] = string[i]^key[i % lenKey];
    }
    /// at this point, new buffer is not guaranteed to be NULL terminated
    return encrypted;
}

您似乎没有将空终止符附加到加密缓冲区的末尾,并且由于 XOR 操作,无法保证 NULL 终止符,甚至不太可能。

添加此行:

...
for(i = 0; i < lenStr; i++) {
    encrypted[i] = string[i]^key[i % lenKey];
}
encrypted[i] = 0;//add this line to explicitly NULL terminate new buffer
...

最新更新