将Big Buffer复制到较小缓冲区的块中

时间:2011-05-19 11:26:21

标签: c pointers

我有一个已知大小的巨大缓冲区。我需要复制它的块以通过套接字发送到服务器。对于这个习惯,我试图一次复制说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;
}

提前致谢

4 个答案:

答案 0 :(得分:4)

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

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
    }
}  

答案 1 :(得分:0)

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

另外,请注意,当发送到套接字(即非结束接收器)时,您必须指定要发送的内容的长度,以便另一端知道要读取的字节数。

答案 2 :(得分:0)

你的循环应该是这样的:

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终止。

答案 3 :(得分:0)

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

write( sock, B, 10 );
write( sock, B + 10, 10 );

(或s / write / sendto /并添加flags参数)。

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