TCP 服务器客户端上的 fread 问题

problem with the fread on TCP server client

我正在构建一个应用程序 TCP 服务器客户端,我想将二进制文件发送到 server/client(所以我不想使用发送和接收)但我有一个问题,我想阅读我客户端的文件描述符不起作用我不明白为什么因为服务器正确接受客户端所以我有这个功能:

bool accept_and_read_client(){
    struct sockaddr_in new_client = { 0 };
    socklen_t length = sizeof(new_client);
    int val_return = accept(sock_fd, (struct sockaddr*)&new_client, &length);
    if(val_return < 0){
        syserr("error of accept");
        return true;
    }
    printf("accept of client successful\n");
    client_array[0].fd = val_return;
    
    size_t nbread;
    client_array[0].file = fdopen(client_array[0].fd, "w+");
    nbread = fread(&val_return, sizeof(char), sizeof(MAX_BUFF), client_array[0].file);
    if(nbread < -1){
        syserr("fread");
        return true;
    }
    printf("number i read : %ld\n", nbread); 
    return false;
}

当我启动服务器时,服务器等待客户端,当我进行 ./client 测试时,服务器说:

accept of client successful
fread: Success

所以函数 fread 失败了。

在 client.c 我做了这样的 fwrite:

...
FILE* fdc = fdopen(sock_fd, "w+");

    if(fdc == NULL){
        syserr("error of fdopen");
        return 1;
    }
    
    printf("%s\n", argv[1]);
    
    size_t nb_write = fwrite(argv[1], sizeof(*argv), strlen(argv[1]), fdc);
    
    printf("number i write: %ld\n", nb_write);
    
    if(fflush(fdc)){
        syserr("fflush");
    }

如果要查看客户端结构:

struct client{
    int fd;
    // char buffer[MAX_BUFF]; 
    FILE* file;
};

struct client client_array[MAX_CLIENTS];

如果有人知道为什么 fread 不起作用请告诉我

fread 函数可能 不会 失败,而是您的检查有缺陷:

size_t nbread;
...
if(nbread < -1)

类型 size_tunsigned 因此当您将 nbread-1 进行比较时,值 -1 将被转换为无符号值也是如此。那个无符号值将 非常大 ,因此 nbread 将始终小于 -1

fread function will not return -1EOF 出错时,它会 return 一个小于计数参数(第三个参数)的值。这就是您需要检查的条件(nbread < sizeof(MAX_BUFF) 使用您当前显示的可能错误的代码)。