尝试从二进制文件中读取足够的字节

时间:2015-03-24 13:38:59

标签: c sockets binary fwrite

我目前正在开发一个项目,我从客户端向服务器发送二进制文件。

我现在面临的主要问题是,当我在文件末尾使用大小为1400(char[1400])的有效负载发送时,它只是读取更多而不仅仅是它发送给我的大小而我认为它读取了一些随机存储区。这个问题就是它为我遗留了程序的其余部分

这是我到目前为止所尝试的内容

   #define MSGSIZE      1400
  #define COUNT     100

  typedef struct {
  int len;
  char payload[MSGSIZE];
  } msg;

   int rest = size % MSGSIZE; 

   int length_final = 0;
        if(rest % sizeof(char) != 0){
            length_final = rest / sizeof(char) + 1;

        }
        else{
            length_final = rest / sizeof(char);
        }



        while(smth<size){
            res = recv_message(&r);
            if(((count = fwrite(r.payload,1,MSGSIZE,file1))+smth)<size){

            sprintf(r.payload,"ACK");
            r.len = 4;

            res = send_message(&r);
            if (res < 0) {
                perror("[RECEIVER] Send ACK error. Exiting.\n");
                return -1;
            }
            else{
                if(smth<size){
                    smth +=count;

                }else{
                    break;
                }

            }   
            }
            else{

                count = fwrite(r.payload,1,length_final,file1);
                sprintf(r.payload,"ACK");
            r.len = 4;

            res = send_message(&r);
            smth +=count;
            }
        }

它仍然无法运作。到目前为止,我的错误是什么?

参考文件包含最后一行[1651]:       706f 7274 00

我的输出文件包含在1651上:        706f 7274 0074 7566 662e 6300 5f5f 4a43,我的文件也打印了100多个随机行

PS:我收到每个recv_message

的字节块

2 个答案:

答案 0 :(得分:1)

要确切地看到你想要做什么并不容易,但是沿着这些方向简化的东西可能有效。具体而言,不是填写整个缓冲存储器,而是仅写入struct中指示的长度。

#define MSGSIZE 1400

typedef struct {
    int len;
    char payload[MSGSIZE];
} msg;

int process_msg(int size) {
    msg ack = {4, "ACK"}, r = {0};
    int res, count;

    while(size > 0){
        res = recv_message(&r);
        if (res < 0) {
            perror("Receiver error. Exiting.\n");
            return -1;
        }
        if (r.len > 0) {
            count = fwrite(r.payload, 1, r.len, file1);
            if (count != r.len) {
                perror("Failed to write to file. Exiting.\n");
                return -1;
            }
        }
        res = send_message(&ack);
        if (res < 0) {
            perror("Failed to send ACK message. Exiting.\n");
            return -1;
        }
        size -= r.len;
    }
    return 0;
}

答案 1 :(得分:0)

您的问题似乎如下:

res = recv_message(&r);
if(((count = fwrite(r.payload,1,MSGSIZE,file1))+smth)<size){

在此,您收到消息,然后写入MSGSIZE值的数据。您似乎忽略了读取数据的正确长度。你没有提供recv_message()的定义,所以我不能说它返回数据长度的位置,但是r结构可能在哪里有一个包含数据长度的字段或者可能res是数据长度。