【问题标题】:Reciving only one byte with recv()使用 recv() 只接收一个字节
【发布时间】:2016-02-26 21:49:24
【问题描述】:

为我的家庭考试在 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);
}

【问题讨论】:

  • 您在循环中正确接收,这很好,但是每次您在循环中迭代时,您都会覆盖缓冲区中的先前数据。发送时你做对了,接收时为什么不做?
  • 至于您遇到的问题,请告诉我们您是如何使用这段代码的?玩具怎么知道你只收到一个字节?你怎么检查这个?并尝试发送每个角色都是独一无二的东西,现在不可能说它是你看到的第一个还是最后一个角色。哦,你确定问题出在接收而不是发送吗?
  • 您的发送(至少)是错误的,您传递了一个 5 字节长的缓冲区 "abcd",但尝试发送 BUFFER_SIZE (1024) 字节......你怎么确定你只收到一个字节?

标签: c sockets tcp server client


【解决方案1】:

问题来了

*buffer = *get_data();

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

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

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

buffer = get_data();

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

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

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 2012-10-25
    • 1970-01-01
    • 2016-06-02
    • 2015-02-16
    • 2020-05-07
    • 2012-04-23
    • 2014-01-14
    • 1970-01-01
    相关资源
    最近更新 更多