【问题标题】:problem with the fread on TCP server clientTCP服务器客户端的fread问题
【发布时间】:2022-01-22 18:35:43
【问题描述】:

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

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 不起作用,请告诉我

【问题讨论】:

  • 首先您尝试读取sizeof(MAX_BUFF) 元素。这很可能是4,因为我猜MAX_BUFF 是一个扩展为int 值的宏,并且在大多数系统上sizeof(int) 等于4。我怀疑您想改为阅读 MAX_BUFF 元素。
  • 第二个问题是当您尝试将MAX_BUFF 字符读入val_return 变量时,因为它是一个只能容纳4 字节的int 变量。你真正想读什么?
  • 最后,如果fread 失败,您需要检查feofferror 以确定失败的原因。此外,在一切正常时返回 true 失败和 false 似乎是错误的。
  • 哦,顺便说一句,client_array[0].fd?为什么你总是使用索引0?您一次不会有多个活动连接吗?
  • 所以根据你的说法,我读到了不好的东西,所以我要向你解释我想读的内容,我在argv[1] 上向客户发送一条消息,所以./client test 发送这个词使用函数fwrite 和 server.ci 上的函数“测试”希望接受客户端并读取 fdc

标签: c sockets server tcp fread


【解决方案1】:

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

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

size_t 类型为 无符号,因此当您将 nbread-1 进行比较时,-1 的值也将转换为无符号值。而且那个无符号值会非常大,所以nbread 总是小于-1

fread 函数在出错时不会 return -1EOF,而是返回一个小于 count 参数(第三个参数)的值。这就是您需要检查的条件(nbread &lt; sizeof(MAX_BUFF) 与您当前显示的可能错误的代码)。

【讨论】:

  • aaah 我明白了,当我评论 if 时,它的输出使我 number i read : 4 即使我使 ./clent hello_test 所以你对我阅读 sizeof(int) 的事实是正确的跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 2020-07-15
  • 1970-01-01
  • 2015-08-29
  • 2012-07-04
  • 2012-08-31
  • 1970-01-01
相关资源
最近更新 更多