2011-05-19 73 views
0

我有一个已知大小的巨大缓冲区。我需要复制它的大块通过套接字发送到服务器。对于这种追求,我试图复制一次说1024个字节,然后发送它。将Big Buffer复制到更小的缓冲区中

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

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

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

在此先感谢

回答

3

进出口你正在做不知道,但我猜你正在尝试做的是这样的:

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

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

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

+1

如何将大小为20的缓冲区复制到大小为4的缓冲区中是否正确? – 2011-05-19 11:35:26

+0

它在一个循环内,它正在复制大小为4的块,直到较大的缓冲区变空。其实,代码并不好,但这是一个索引和长度的问题,这个想法是可以的。 – 2011-05-19 11:51:53

+0

嗨迭戈,你能解释指数错在哪里吗? – user489152 2011-05-19 12:03:58

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

0

没有必要复制任何东西,因为两者的sendto和写入需要的尺寸参数。如果你有20个字节的缓冲区B数据,并希望将其打入插座大小为10的两包,你只是做:

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

(或S /写/ SENDTO /并添加标志参数)。

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

+0

哦,谢谢!好了,我懂了。将更新部分代码 – user489152 2011-05-19 12:03:16