Скопируйте Большой буфер в порции меньшего буфера - PullRequest
1 голос
/ 19 мая 2011

У меня огромный буфер известного размера. Мне нужно скопировать его фрагменты для отправки через сокеты на сервер. Для этой цели я пытаюсь скопировать, скажем, 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 ]

4 голосов
/ 19 мая 2011

Я не уверен, что вы там делаете, но я думаю, вы пытаетесь сделать что-то вроде:

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 голосов
/ 19 мая 2011

Нет необходимости копировать что-либо, так как sendto и write принимают аргумент размера.Если у вас есть 20 байтов данных в буфере B, и вы хотите разбить их на два пакета размером 10 на сокете, вы просто делаете:

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

(или s / write / sendto / идобавить аргумент flags).

Использование memcpy в этой ситуации просто трата времени.

0 голосов
/ 19 мая 2011

Ваш цикл должен быть таким:

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 голосов
/ 19 мая 2011

Ваш код по существу верно.Единственная часть, которая не будет работать, это printf, потому что, если у вас есть двоичный контент, вы не сможете отобразить его в консоли.

Также обратите внимание, что при отправке в сокеты, которые не являютсязаканчивая приемники, вы должны указать длину отправляемого вами сообщения, чтобы другой конец знал, сколько байтов нужно прочитать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...