使用recv()仅返回一个字节

时间:2015-11-24 12:37:16

标签: c sockets tcp server client

创建tcp客户端< - >用于我家庭考试的服务器程序。在服务器和客户端之间发生reciev并发送数据时遇到了一些问题。我只能收到一个字节,如果我发送" 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);
}

1 个答案:

答案 0 :(得分:1)

问题出在这里

dt3[mapply(grepl, x=variables, chk)]
#   ID variables chk
#1:  1     a | b   b
#2:  2     a | c   a
#3:  4 e | b | a   a

您取消引用*buffer = *get_data(); 返回的指针,只获取指针指向的第一个元素指针。

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

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

buffer

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

receive