【问题标题】:Copy Big Buffer into chunks of smaller buffer将大缓冲区复制到较小缓冲区的块中
【发布时间】:2011-05-19 11:26:20
【问题描述】:

我有一个已知大小的巨大缓冲区。我需要复制它的大块以通过套接字发送到服务器。为此,我尝试一次复制 1024 个字节,然后发送。

这里的问题是,我不知道缓冲区的内容。它可以是字符串或二进制文件。它应该适用于缓冲区中包含的所有数据。

这是我编写的代码,当然它不起作用。这只是一个小测试代码,我先使用一个字符串。稍后我想用一些二进制等测试它。但首先我必须正确地理解指针概念!

int main(int argc, char *argv[]){

    char hexstr [] = { 0x02, 0x01, 0x03, 0x04, 0x05, 0x06};
    //trying with a string
    char Bbuf [20]= "Hihelloohowareyou?";
    FillBuffer( Bbuf,sizeof(Bbuf));

        return 0;
}


int FillBuffer(char *bigbuf, int len){

    char smallbuf[4];
    int i = 0;
    int buflen= sizeof(smallbuf);
    printf("length of smallbuf is= %d\n",buflen);
    printf("length of original string= %d\n", len);
    for( i=buflen; i< len+buflen;i =i+buflen){
        memcpy(smallbuf,bigbuf,i);
        printf("i== %d\n", i);
        bigbuf= bigbuf+i;
        //printf("smallbuf conatins= %s\n", smallbuf);
    }

    return 0;
}

提前致谢

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    我不确定你在那里做什么,但我猜你正在尝试做类似的事情:

    void Stuff(char* bbuf, int size)
    {
        char buf[4];
        int remain = size;
        while (remain)
        {
          int toCpy = remain > sizeof(buf) ? sizeof(buf) : remain;
          memcpy(buf, bbuf, toCpy);
          bbuf += toCpy;
          remain -= toCpy;
          DoStuff(&buf, toCpy); //Send the buffer or whatever
        }
    }  
    

    【讨论】:

      【解决方案2】:

      您的代码基本上是正确的。唯一不起作用的部分是printf,因为如果您有二进制内容,则无法在控制台中显示它。

      另外,请注意,当发送到作为非终结接收器的套接字时,您必须指定要发送的内容的长度,以便另一端知道要读取多少字节。

      【讨论】:

      • 如何将大小为 20 的缓冲区复制到大小为 4 的缓冲区中是正确的?
      • 它在一个循环中,它正在复制大小为 4 的块,直到更大的缓冲区变空。其实代码是不行的,不过是索引和长度的问题,思路还行。
      • @user489152,您可以在@Robert J. answer 中看到如何正确执行循环的示例。
      【解决方案3】:

      你的循环应该是这样的:

      for(i = 0; i < len; i += buflen)
      {
          memcpy(smallbuf,bigbuf+i,buflen);
          printf("i== %d\n", i);
          // Note that printf wont work since the string is not NULL-terminated.
          //printf("smallbuf conatins= %s\n", smallbuf);
      }
      

      如果你想通过网络发送这个,你可能想把你的缓冲区放入一个数据包结构中,至少包含多少数据实际有用的信息(如果大缓冲区大小不能被小缓冲区整除)。如果要发送字符串以外的其他数据,则不能真正使用 NULL 终止。

      【讨论】:

        【解决方案4】:

        没有必要复制任何东西,因为 sendto 和 write 都需要一个大小参数。如果缓冲区 B 中有 20 个字节的数据,并且想在套接字上将其分成两个大小为 10 的数据包,则只需:

        写(袜子,B,10); 写(袜子,B + 10, 10);

        (或 s/write/sendto/ 并添加一个标志参数)。

        在这种情况下使用 memcpy 只是在浪费时间。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-11-11
          • 1970-01-01
          • 2020-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-25
          • 1970-01-01
          相关资源
          最近更新 更多