使用 recv() 只接收一个字节

Reciving only one byte with recv()

为我的家庭考试用 c 创建一个 tcp 客户端 <-> 服务器程序。 运行 在服务器和客户端之间接收和发送数据时遇到了一些问题。我只能收到一个字节,如果我发送 "abcd" 我会收到 "a"。

(这是双向发生的,因为我对服务器和客户端使用相同的方法)

不知道是发送端的问题还是接收端的问题

这是我的代码:

#define BUFFER_SIZE 1024

char* recived_message;

int send_data(int socket, char* data){
    int offset = 0, len = strlen(data);

    while (offset != len) {
        int nb = send(socket, data + offset, len - offset, 0);

        if (nb < 0){
            perror("send");
            return -1;
        }
        offset += nb;
    }

    return 0;
}

int recive(int socket){
    int offset = 0;

    recived_message = malloc(BUFFER_SIZE);
    memset(recived_message, 0, BUFFER_SIZE);

    while (offset != BUFFER_SIZE) {
        int nb = recv(socket, received_message + offset, BUFFER_SIZE - offset, 0);

        if(nb == -1){
            perror("read");
            return -1;

        }else if(nb == 0){
            return -1;
        }

        offset += nb;
    }

    printf("%d\n", offset);

    return 0;
}

char* get_data(){
    return recived_message;
}

服务器端

int recive_data(int socket){
    char* buffer;

    if(recive(socket) != 0){
        return -1;
    }

    *buffer = *get_data();

    printf("socket %d: %s\nlength: %lu%", fd, buffer, strlen(buffer));

    return 0;
}

部分客户

char* test = "abcd";

for(i=0; i<10; i++) {
    send_data(sock, test);
    sleep(1);
}

问题就在这里

*buffer = *get_data();

您取消引用 get_data() 返回的指针以仅获取指针指向的第一个元素指针。

而且比这更糟糕,因为您取消引用未初始化的变量 buffer 来写入该单个字符。这将导致未定义的行为。此外,使用此未初始化变量的后续函数调用也会导致未定义的行为。

解决(几乎)所有问题的简单方法:分配给实际变量:

buffer = get_data();

而且我说以上解决了几乎你所有的问题,因为如果字符串的终止零没有被传输怎么办?这也将导致 UB(未定义行为)。如果您收到的数据始终是一个字符串,那么您应该确保它已终止,最好是在 receive 函数中:

int recive(int socket){
    ...
    received_message[offset] = '[=12=]';
    return 0;
}