Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2010, 16:38   #1
Werewolf-Prankster
 
Регистрация: 05.07.2010
Сообщений: 6
По умолчанию FTP-сервер. Баг - работает не со всеми клиентами

Ситуация такая. Я написал на С++ FTP-сервер. (топорный, глючноватый и т.д. Не суть важно). С тоталом работает коректно и никаких проблемм не возникает. С FileZilla тоже. Эксплорер не отвечает на приветствие, а опера не идет дальше запроса на логин. Может кто-то уже занимался таким? Или как можно посмотреть в бинарном режиме как происходит обмен между двумя программами. Хотя бы локально.

Код отправки ответов серверу
Код:
	char	CMD[4],
			temp[BUFSIZE],
			temp2[BUFSIZE];
	int		i;

	strncpy(CMD,str,4);
	if(strncmp(CMD,"USER",4) == 0)
	{	
//Ненужный обработчик
		printf("%s -> 530 User unknown\r\n",param->ip);
		send(param->s,"530 User unknown\r\n",sizeof("530 User unknown\r\n"),0);
		param->fLogin = false;
		return 530;

	}
	if(strncmp(CMD,"PASS",4) == 0)
	{
//Ненужный обработчик
			printf("%s -> 530 User not registered\r\n", param->ip);
			send(param->s,"530 User not registered\r\n",sizeof("230 User not registered\r\n"),0);
			param->fLogin = false;
			return 530;
		}
	}
// -------------------------------------------
// Тут вырезана часть кода на ненадобностью
// -------------------------------------------
	printf("%s -> 500 Command not understand\r\n", param->ip);
	send(param->s,"500 Command not understand\r\n",
		sizeof("500 Command not understand\r\n"),0);
	return 500;
Пробовал посылать и посимвольно и пакетом. Результат один и тот же. Никакой...
Werewolf-Prankster вне форума Ответить с цитированием
Старый 05.07.2010, 16:46   #2
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

вам никто не ответит, из-за недостаточности информации. Например, в куске кода, который вы вырезали (непонял откуда), я невижу ничего абсолюбтно. Хотите разобраться - кидайте весь исходник. Я люблю такое разбирать
подпись
liljon вне форума Ответить с цитированием
Старый 05.07.2010, 16:50   #3
Werewolf-Prankster
 
Регистрация: 05.07.2010
Сообщений: 6
По умолчанию

2 liljon
Пожалуйста. Тут все. Мне своего кода не жалко. Но стыдно =))
Проект VC++ 6.0
(писалось за 4 дня перед курсачом. Просто хотелось сделать из этого хотябы то, чем бы я сам мог бы пользоваться)
Вложения
Тип файла: rar WPFTP C 4.rar (19.9 Кб, 18 просмотров)
Werewolf-Prankster вне форума Ответить с цитированием
Старый 05.07.2010, 16:58   #4
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

это ж Си++, почему не оформлено в классе? ладно... будем разбираться
подпись
liljon вне форума Ответить с цитированием
Старый 05.07.2010, 17:16   #5
Werewolf-Prankster
 
Регистрация: 05.07.2010
Сообщений: 6
По умолчанию

Я Си знаю не очень и как оформить поток методом класса так и не понял. А разбираться времени не было. Сейчас надо разобраться в основных багах, а потом уже переделывать
Werewolf-Prankster вне форума Ответить с цитированием
Старый 05.07.2010, 17:39   #6
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию



мозила устанавливает бинарную передачу данных, что видно в консоли (обведенно красным кружком с номером 1)

1. В таком режиме список файов получаеться командой RETR [dir] - где dir это директория на сервере. ( в консоли хочет получить список корневого каталога)
2. Не обработана команда SIZE

чо я сделал?
Код:
int cmdLIST2(LPVOID tParam)
{
	char * out;
	int offset = 0;
	out = (char*)calloc(10000,1); // буфер в который пойдет содержимое листига. Размер буфера задал от фанаря, расчитать не сложно

	THREAD_PARAM *param = (THREAD_PARAM *)tParam;
	HANDLE hFind;
	WIN32_FIND_DATA FindFileData;
	char			SearchDir[BUFSIZE];


	memset(&FindFileData,0,sizeof(FindFileData));

	memset(SearchDir,0,sizeof(SearchDir));
	stradd(SearchDir,param->RootDir);
	stradd(SearchDir,param->PWD);
	stradd(SearchDir,"*");

	hFind = FindFirstFile(SearchDir, &FindFileData);
	memset(SearchDir,0,sizeof(SearchDir));
	strcpy(SearchDir,cmd_ls(FindFileData));
#ifdef DEBUG
	printf(SearchDir);
#endif
	send(param->DataSock,SearchDir,strlen(SearchDir),0);
	while(FindNextFile(hFind, &FindFileData))
	{
		memset(SearchDir,0,sizeof(SearchDir));
		strcpy(SearchDir,cmd_ls(FindFileData));
#ifdef DEBUG
		printf(SearchDir);
#endif
		memcpy(out + offset, SearchDir,strlen(SearchDir)); //потихоньку это дело копирнул
		offset += strlen(SearchDir);
	}
	FindClose(hFind);

	int ret = send(param->DataSock,out,offset - strlen(SearchDir),0); // отправил по убогому
	if(param->fPASV)
	{
		param->fPASV = false;
		closesocket(param->DataSock);
	}
	return 0;
}
Код:
	if(strncmp(CMD,"RETR",4) == 0)
	{
		if((!param->fPASV) && (!param->fPORT))
		{
			printf("%s -> 425 Use PORT or PASV first\r\n",param->ip);
			send(param->s,"425 Use PORT or PASV first\r\n",
				sizeof("425 Use PORT or PASV first\r\n"),0);
			return 425;
		}else
		{
			int error;
			memset(temp,0,sizeof(temp));
			stradd(temp,"150 Data connection accepted from ");
			stradd(temp,param->ip);
			stradd(temp,"\r\n");
			printf("%s -> %s",param->ip,temp);
			send(param->s,temp,
				strlen(temp),0);
			memset(temp2,0,sizeof(temp));
			strnmcpy(temp2,str,5,length-3);
			memset(temp,0,sizeof(temp));
			stradd(temp,param->RootDir);
			stradd(temp,param->PWD);
			stradd(temp,temp2);

                        cmdRETR2(param);
			/*if((error = cmdRETR(temp,param)) == -1)
			{
				printf("%s -> 550 No such file\r\n",param->ip);
				send(param->s,"550 No such file\r\n",
					sizeof("550 No such file\r\n"),0);			
				return 550;
			}
			printf("%s -> 226 Binary Transfer complete\r\n",param->ip);
			send(param->s,"226 Binary Transfer complete\r\n",
				sizeof("226 Binary Transfer complete\r\n"),0);	*/		
			return 226;
		}
	}
Код не идеальный, написал лишь для проверки. Вам необходимо разобраться с бинарным типом передачи данных, когда клиент посылает "TYPE I".
Я и сам не до конца разобрался, но направил на путь истиный
все...
Изображения
Тип файла: jpg ftp_server.JPG (116.1 Кб, 160 просмотров)
подпись

Последний раз редактировалось liljon; 05.07.2010 в 17:42.
liljon вне форума Ответить с цитированием
Старый 05.07.2010, 17:48   #7
Werewolf-Prankster
 
Регистрация: 05.07.2010
Сообщений: 6
По умолчанию

Ну то что файрфокс просит список ретром я знал, но не обрабатывал. Больше волнует Эксплорер и Опера, т.к. они не реагируют соовсем

За код спасибо. Только смысл? Вы отправляете всей пачкой, но от этого ничего не меняется. Я шлю как-бы пакетами, пока не завершиться передача. А если файлов тысячи штук? =)
Werewolf-Prankster вне форума Ответить с цитированием
Старый 05.07.2010, 20:25   #8
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

оперы нет у меня. а вот эксплорер при получении привествия от сервера ничего не хочет отсылать =\ я незнаю в чем проблема
подпись
liljon вне форума Ответить с цитированием
Старый 06.07.2010, 12:53   #9
Werewolf-Prankster
 
Регистрация: 05.07.2010
Сообщений: 6
По умолчанию

А есть какие-то программы чтобы перехватить соединение между сервером и клиентом хотябы на локальной машине. Чтобы посмотреть как они общаются
Werewolf-Prankster вне форума Ответить с цитированием
Старый 09.07.2010, 14:29   #10
Werewolf-Prankster
 
Регистрация: 05.07.2010
Сообщений: 6
По умолчанию

Вопрос все еще актуален. Есть у кого-то хоть какие-то идеи? =)
Werewolf-Prankster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FTP сервер на инди CraZZy RabbIt Работа с сетью в Delphi 9 16.08.2009 18:27
копирование обновленного файла с ftp на сервер dirrer Работа с сетью в Delphi 11 16.03.2009 17:07
Чтобы программа заходила на ftp сервер lexaltd Работа с сетью в Delphi 1 01.08.2008 22:59
загрузить файл на сервер с помощью ftp andrey4623 PHP 3 29.06.2008 20:29