Автоматический upload данных по Internet

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
leonid
Частый Гость
Сообщения: 26
Зарегистрирован: 21 фев 2003, 11:42
Откуда: Toronto

Автоматический upload данных по Internet

Сообщение leonid »

Дано:
- Несколько десятков кастомеров, во многих странах мира.
- У каждого катомера стоит наша софтина (на Windows 2000 Professional), которая в числе прочего пишет результаты измерений в ASCII лог файлы. Каждый лог файл размером 1-4М, за год может "набежать" 300-400М этих файлов.
- Периодически наши сотрудники звонят кастромерам по Pc-anyware и скачивают интресущие их логи (чтобы потом строить графики в Excel).
- Кастомеры очень параноидальны на счет Network Security.

Задача:
Написать софтину (или можеть есть готовая), котрая будет бежать у каждого кастомера и периодически (каждый час) будет пересылать последние изменения в лог файлах (за час накопится 30-40К) в офис нашей вирмы в GTA.

С учетом параноидальности кастомеров HTTP выглядит предпочтительнее. Т.к. это все бежит на Microsoft, до думаю в направлении .Net Web Services. Что порекомендуют многоопытные люди?

Критерии следующие:
- Легкость уламываания кастомеров на предмет и Network Security
- Наименьший геморй с написанием, сопровождением и деплойментом
- Ну и чтоб работало
Аватара пользователя
Vovka
Завсегдатай
Сообщения: 250
Зарегистрирован: 18 фев 2003, 12:17

Re: Автоматический upload данных по Internet

Сообщение Vovka »

leonid писал(а):Дано:
- Несколько десятков кастомеров, во многих странах мира.
- У каждого катомера стоит наша софтина (на Windows 2000 Professional), которая в числе прочего пишет результаты измерений в ASCII лог файлы. Каждый лог файл размером 1-4М, за год может "набежать" 300-400М этих файлов.
- Периодически наши сотрудники звонят кастромерам по Pc-anyware и скачивают интресущие их логи (чтобы потом строить графики в Excel).
- Кастомеры очень параноидальны на счет Network Security.

Задача:
Написать софтину (или можеть есть готовая), котрая будет бежать у каждого кастомера и периодически (каждый час) будет пересылать последние изменения в лог файлах (за час накопится 30-40К) в офис нашей вирмы в GTA.

С учетом параноидальности кастомеров HTTP выглядит предпочтительнее. Т.к. это все бежит на Microsoft, до думаю в направлении .Net Web Services. Что порекомендуют многоопытные люди?

Критерии следующие:
- Легкость уламываания кастомеров на предмет и Network Security
- Наименьший геморй с написанием, сопровождением и деплойментом
- Ну и чтоб работало
заливание файла к вам через ФТП, ХТТП самое простое что можно придумать, делается за день
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

На сокетах. Преимущество - всё очень прозрачно, жёвано-пережёвано.
У клиентов - клиенты. На серверах, куда сливается статистика - догадайся, что? :D
Пишется - не могу сказать сколько, ибо у каждого программера "болванки" уже давно написаны для аналогичных задач.
Кто за полдня напишет, кто за день. Кто за день - а скажет и потребует бабки за месяц работы :D
Ну, на тестирование - ну, неделя.
С портированием тоже не будет проблем, если использовать интерфейс Беркли.

Вот.

Критерии следующие:
- Легкость уламываания кастомеров на предмет и Network Security
легко
- Наименьший геморй с написанием, сопровождением и деплойментом
Вообще никакого. В редми напишешь - запустите сетуп.
- Ну и чтоб работало
Нет апи более отлаженного. Энто апи и используется при программировании сокетов.

ПС. А вообще Vovka прав. Хоть и дубово, и потребует напряжения свех сил и фибр души сотрудников удалённых контор - но железное решение. :D
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Да, кстати, Лепсик!
Пусть посылают Вам файло с некоторой периодичностью (скажем, раз в месяц) - мылом.
Серьёзно. Одна из федеральных баз у нас так и "актуализируется". :o

Останется только кастомеров пользоваться аутлуком. :lol: Я серьёзно.
leonid
Частый Гость
Сообщения: 26
Зарегистрирован: 21 фев 2003, 11:42
Откуда: Toronto

Сообщение leonid »

vg писал(а):На сокетах.
А сокет-сервер будет слушать порт 80, и кастомер будет думать что связь идет по HTTP?
vg писал(а):Пусть посылают Вам файло с некоторой периодичностью (скажем, раз в месяц) - мылом.
Кастомера напрягать не годится, он вообще не обязан знать где наши логи находятся. И раз в месяц слишком редко.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

leonid,
vg:
На сокетах.

А сокет-сервер будет слушать порт 80, и кастомер будет думать что связь идет по HTTP?
Вы что - смеётесь? Кто говорил про 80 порт? :D
Серверный сокет будет слушать порт, который Вы укажите в bind после создания сокета, например, 60. Клиент будет коннектиться именно к этому порту. :lol:

Очень упрощённо (эта ремарка не Вам, а данило-сокето-мастерам-злопыхателям):

Серверная сторона

Код: Выделить всё

                ...
                
	SOCKET mysocket;
	if ((mysocket=socket(AF_INET,SOCK_STREAM,0))== INVALID_SOCKET)
	{
                //обрабатываем
                 ...
	}

	sockaddr_in local_addr;
	local_addr.sin_family=AF_INET;
	local_addr.sin_port=htons(SERVERPORT);
	local_addr.sin_addr.s_addr=0;
	if (bind(mysocket,(sockaddr *) &local_addr, sizeof(local_addr)))
	{
                 //обрабатываем
                  ...

	}

	if (listen(mysocket, 0x100))
	{
                 //обрабатываем
                 ...

	}
                ....
Здесь как назначите в макро SERVERPORT значение порта, так будет,
например,

#define SERVERPORT 60
pank
Пользователь
Сообщения: 75
Зарегистрирован: 26 фев 2003, 20:19
Откуда: toronto

re

Сообщение pank »

на бэйсике+ASP - час писать, часа 3 отлаживать
leonid
Частый Гость
Сообщения: 26
Зарегистрирован: 21 фев 2003, 11:42
Откуда: Toronto

Re: re

Сообщение leonid »

pank писал(а):на бэйсике+ASP - час писать, часа 3 отлаживать
Подробнее пожалуйста про бэйсик+ASP. На клиенте тоже бэйсик+ASP? Ведь именно клиент должен аплоадить автоматически данные на сервер.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

2leonid, Vovka,

Опять же думаю, Вовка прав. На фпт можно заливать файло не "руками" Ваших кастомеров, а написать специализированного фтр-клиента.
Такой клиент в соответствии в определённым Вами шедул будет только отправлять на Вас фтп-сервер статистику.
Примеров исходников фтп-клиентов - море в инете.
С безопасниками Ваших кастомеров договариваться легко - они в ACL разрешат только трафик фтп-клиента. Обычная практика. Если у них (безопасников) и возникнут параноидальные сомнения, мол, а не троян ли у нас - предоставьте им сорсы клиентского ПО.

ПС.
Кстати, на бейсике тоже можно написать (сам не писал, но видел сорсы). Клёвость в этом заключается в дополнительных аргументах у Вас в разговоре с безопасниками-параноиками Ваших клиетов. Как правило параноики - безграмотные, и кроме бейсика ничего не знают. Да и бейсик тольком не знают. Отдадите им VB-сорсы - они будут спать спокойно.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

2pank,
часа 3 отлаживать
За три часа разместишь код у клиента?

ПС. То, что возможно уже через 15 минут будет у тебя нормально работать на твоём сервере в локалке или 127.0.0.1 - ещё не показатель, что это будет работать у удалённых кастомеров автора топика. И будет ли вообще работать. Так, что 3 часа, думаю, это гипербола.
leonid
Частый Гость
Сообщения: 26
Зарегистрирован: 21 фев 2003, 11:42
Откуда: Toronto

Сообщение leonid »

Дополнительные вопросы:

1. В случае с сокетами, как быть со всякими там прокси у клиентов? Небось руками все писать нужно и под каждый тип прокси-сервера "доводить". Сам никогда ничего для интернета не писал на сокетах, потому и спрашиваю. В локалке все должно работать нормально.

2. Аналогичный вопрос про фтп-клиента.

3. Можно ли сделать upload файла в HTTP (типа как они в yahoo mail atatchments подгружают). Я ничего путного про "HTTP file upload" в гугле найти не могу. Конечно можно содержимое файла "впихнуть" в HTML форму, тем более, что файл текстовый.

Я почему на HTTP "зациклился", уж очень аргумент заманчивый: "закрывайте на клиенте все что хотите, оствьте только выход в и-нет для IE". Или я не туда думаю?
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

2leonid,
1. В случае с сокетами, как быть со всякими там прокси у клиентов? Небось руками все писать нужно и под каждый тип прокси-сервера "доводить". Сам никогда ничего для интернета не писал на сокетах, потому и спрашиваю. В локалке все должно работать нормально.
2. Аналогичный вопрос про фтп-клиента.
Разумеется, придётся руками. Да при этом ещё надо учесть, что стоит у кастомеров в горле сетки: SOCKS 4, SOCKS 5 - сервера? :lol: Для NAT - ничего делать и не надо + к тому, что в локалке, имхо. Если хост кастомера непосредственно смотрит в инет, то ничего делать не надо - всё как в локалке.
В отдельных случаях, только для MS ISA Server 2000, вроде как на клиенте достаточно установить ихнего firewall-клиента. Сам не пробовал. Но вряд ли на это стоит ориентироваться (очень уж специфическая штука).
....Конечно можно содержимое файла "впихнуть" в HTML форму, тем более, что файл текстовый.
Я почему на HTTP "зациклился", уж очень аргумент заманчивый: "закрывайте на клиенте все что хотите, оствьте только выход в и-нет для IE". Или я не туда думаю?
Ну, а что. Вполне здравая идея. Не мой профиль, не могу подсказать что-нить конкретное. Но здесь, на форуме много веб-архитекторов. Думаю, подскажут, как это лучше сделать, чтоб было "автоматически", как вы хотите.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

2leonid,

Я пропостил - "не мой профиль". Имелось ввиду, что я не программист :D . Так .... в около-IT. :D
Аватара пользователя
Vovka
Завсегдатай
Сообщения: 250
Зарегистрирован: 18 фев 2003, 12:17

Сообщение Vovka »

leonid писал(а):Дополнительные вопросы:

1. В случае с сокетами, как быть со всякими там прокси у клиентов? Небось руками все писать нужно и под каждый тип прокси-сервера "доводить". Сам никогда ничего для интернета не писал на сокетах, потому и спрашиваю. В локалке все должно работать нормально.

2. Аналогичный вопрос про фтп-клиента.

3. Можно ли сделать upload файла в HTTP (типа как они в yahoo mail atatchments подгружают). Я ничего путного про "HTTP file upload" в гугле найти не могу. Конечно можно содержимое файла "впихнуть" в HTML форму, тем более, что файл текстовый.

Я почему на HTTP "зациклился", уж очень аргумент заманчивый: "закрывайте на клиенте все что хотите, оствьте только выход в и-нет для IE". Или я не туда думаю?
есть такой метод пост, по нему и ищи инфу например c# and post http
главное чтобы на сервере все чики было, я и Хттп и ФТП писал
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

2leonid,

Интересно, какое Вы приняли решение?
Может Вы неправильно меня поняли? Я постил, что действительно нужно в общем случае знать особенности межсетевого экрана (в Канаде говорят firewall), который отделяет локальную сеть от инет. Там я постил про SOCKS 4, SOCKS 5. Но может у Вас сложилось неверное впечатление, что раз firewall, то значит что-то жутко сложное?
Протоколы SOCKS - не то, что просто, а очень просто. Просто некоторые недопрограммеры сознательно наводят здесь туман, дескать - как всё сложно! Наверное, чтоб подчеркнуть собственную значимость, или урвать больше денег. На самом деле работа с этими протоколами ничуть не сложнее, чем всё делается в LAN. Тем, более, что практически все firewall (как промышленные, так и самоделки) поддерживают не только SOCKS 5, но и старый SOCKS 4. А там не то, чтоб очень просто - там проще пареной репы. В двух словах:

1) программер создаёт на клиенте сокет, положим socket, и коннектится не к инет-хосту, а к SOCKS-серверу. Этот SOCKS-сервер расположен "на firewall", и доступен из локальной сети. Обычно он слушает порт 1080.

2) программер посылает SOCKS-серверу запрос (а лучше здесь сказать сообщение) очень простого формата, в котором "говорит", что он хочет в дальнейшем посылать пакеты на такой-то хост в инет, и на такой-то порт. Этот запрос посылают обычным send API на сокет socket, который бы создан на шаге 1.

3) Всё. Если SOCKS-сервер ответит OK!, (это вычитывается из сокета socket обычной функцией API recv), то дальше пишут и читают из сокета socket обычным образом, как для LAN.

Ниже - работающий пример, как послать почту по smtp с компа, который расположен в LAN и прикрыт firewall, понимающим SOCKS 4. Таких примеров в инете море. И это уровень джуниор С-программера, по крайней мере, в совке. Пример, намеренно написан "размашесто" в учебных целях для ясности того, что делается:

Код: Выделить всё

int _tmain(int argc, _TCHAR* argv[])
{
	WSAData wsaData;

	if (WSAStartup(0x202,(WSADATA *)&wsaData ))
	{
		printf("WSAStart error %d\n",WSAGetLastError());
		return -1;
	}

	// Cоздаём обычный сокет, как для LAN.
	SOCKET sock;
	sock=socket(AF_INET,SOCK_STREAM,0);
	if ( sock < 0 )
	{
		printf("Socket() error %d\n",WSAGetLastError());
		closesocket(sock);
		WSACleanup();
		return -1;
	}
	
	// socks-сервер у нас в локальной сети здесь
	#define SOCKSSERVER	"192.168.x.y"
	#define SOCKSPORT		1080
	
	sockaddr_in				socks_addr;
	socks_addr.sin_family	= AF_INET;
	socks_addr.sin_port		= htons(SOCKSPORT);
	socks_addr.sin_addr.s_addr= inet_addr(SOCKSSERVER);

	// коннектимся не к майл-серверу, а к сокс-серверу (посреднику)
	if ( connect( sock,(sockaddr *)&socks_addr, sizeof(socks_addr)) )
	{
		printf("Connect error %d\n",WSAGetLastError());
		closesocket( sock );
		WSACleanup();
		return -1;
	}
	printf("Connection with SOCKSSEREVER %s Ok\n",SOCKSSERVER);

	// подготовим запрос к сокс-серверу, в котором только расскажем, чтобы
	// нам необходим туннель к хосту 194.67.23.10 и порту 25
	// весь сокс-запрос поместится в char sockscmd[9]
	// (часть полей запроса не будем заполнять)

	_DWORD	sin_addr	= inet_addr( "194.67.23.10" ); // это инет-адрес майлера
	_WORD	sin_port	= htons( 25 );					

	char	sockscmd[9];
	memset( sockscmd, 0, 9 );

	sockscmd[0]			= 4; // версия. socks 4
	sockscmd[1]			= 1; // команда
	memmove( &sockscmd[2], &sin_port, 2 ); // порт инет-хоста
	memmove( &sockscmd[4], &sin_addr, 4 ); // его инет-адрес

	_send( sock, (_BYTE *) sockscmd, 9 , 0, 1 );
	int num = _recv( sock, (_BYTE *) sockscmd, 8, 0 , 1);
	if ( num != 8 || sockscmd[1]!=90 )
	{
		printf("Socks request failed. Press any key ...\n");
		closesocket(sock);
		WSACleanup();
		getch();
		return -1;
	}
	printf("Socks request success.\n");
	
	// Эти строчки и далее уже не имеют отношения к SOCKS.
	// Это обычная запись и чтение из сокета, как если б он был в LAN 
	// или наш хост смотрел бы непосредственно в инет
	// В данном случае мы посылаем письмо на mail.ru
	
	char *shelo	= "HELO mail.ru\r\n";
	char *sfrom	= "MAIL FROM:<vg_123@mail.ru>\r\n";
	char *srcpt	= "RCPT TO:<vg_123@mail.ru>\r\n";
	char *sdata	= "DATA\r\n";
	char *smsg	= "SUBJECT: SOCKS 4\r\nHello!\r\n\r\n.\r\n";
	char *squit	= "QUIT\r\n";

	// строки откликов smtp невелики. хватит с избытком. 
	char rcvbuf[256];

	// здесь прочитаем приветствие майлера.
	// читаем из сокета сокс-сервера обычным образом,
	// как если б это был сокет майлера
	// сокс-сервер прозрачно для нас мапит все запросы на удалённый хост
	memset( rcvbuf, 0, 256 );
	int rcvbytes = _recv( sock, (_BYTE *) rcvbuf, 256, 0, 1);
	printf("%s\n",rcvbuf);

	// HELO
	printf("%s\n",shelo);
	_send( sock, (_BYTE *) shelo, (_DWORD) strlen(shelo), 0, 1);
	memset( rcvbuf, 0, 256);
	rcvbytes = _recv( sock, (_BYTE *) rcvbuf, 256, 0, 1);
	printf("%s\n",rcvbuf);

	// MAIL FROM
	printf("%s\n",sfrom);
	_send( sock, (_BYTE *) sfrom, (_DWORD) strlen(sfrom), 0, 1);
	memset( rcvbuf, 0, 256);
	rcvbytes = _recv( sock, (_BYTE *) rcvbuf, 256, 0, 1);
	printf("%s\n",rcvbuf);

	// RCPT TO
	printf("%s\n",srcpt);
	_send( sock, (_BYTE *) srcpt, (_DWORD) strlen(srcpt), 0, 1);
	memset( rcvbuf, 0, 256 );
	rcvbytes = _recv( sock, (_BYTE *) rcvbuf, 256, 0 , 1);
	printf("%s\n",rcvbuf);

	// DATA
	printf("%s\n",sdata);
	_send( sock, (_BYTE *) sdata, (_DWORD) strlen(sdata), 0, 1);
	memset( rcvbuf, 0, 256 );
	rcvbytes = _recv( sock, (_BYTE *) rcvbuf, 256, 0 , 1);
	printf("%s\n",rcvbuf);

	// MSG
	printf("%s\n",smsg);
	_send( sock, (_BYTE *) smsg, (_DWORD) strlen(smsg), 0, 1);
	memset( rcvbuf, 0, 256 );
	rcvbytes = _recv( sock, (_BYTE *) rcvbuf, 256, 0 , 1);
	printf("%s\n",rcvbuf);

	// QUIT
	printf("%s\n",squit);
	_send( sock, (_BYTE *) squit, (_DWORD) strlen(squit), 0, 1);
	memset( rcvbuf, 0, 256 );
	rcvbytes = _recv( sock, (_BYTE *) rcvbuf, 256, 0 , 1);
	printf("%s\n",rcvbuf);

	shutdown( sock, SD_SEND );
	closesocket( sock );
	WSACleanup();

	printf("\nAny key for exit...");
	getch();

return 0;	
}
В этом коде видно - то, что связано с SOCKS, и что обеспечивает "работу сквозь прокси" - это копейки. Здесь мы подконнектились к сокс-серверу в локальной сети 192.168.x.y:1080. Сказали, что дальше в инете будем "говорить" с майлером 194.67.23.10:25. А дальше всё делаем, как для локальной сети. Пишем и читаем в тот же сокет SOCKS-сервера:

Код: Выделить всё

	#define SOCKSSERVER	"192.168.x.y"
	#define SOCKSPORT		1080
	
	sockaddr_in				socks_addr;
	socks_addr.sin_family	= AF_INET;
	socks_addr.sin_port		= htons(SOCKSPORT);
	socks_addr.sin_addr.s_addr= inet_addr(SOCKSSERVER);

	// коннектимся не к майл-серверу, а к сокс-серверу (посреднику)
	if ( connect( sock,(sockaddr *)&socks_addr, sizeof(socks_addr)) )
	{
		printf("Connect error %d\n",WSAGetLastError());
		closesocket( sock );
		WSACleanup();
		return -1;
	}
	printf("Connection with SOCKSSEREVER %s Ok\n",SOCKSSERVER);

	// подготовим запрос к сокс-серверу, в котором только расскажем, чтобы
	// нам необходим туннель к хосту 194.67.23.10 и порту 25
	// весь сокс-запрос поместится в char sockscmd[9]
	// (часть полей запроса не будем заполнять)

	_DWORD	sin_addr	= inet_addr( "194.67.23.10" ); // это инет-адрес майлера
	_WORD	sin_port	= htons( 25 );					

	char	sockscmd[9];
	memset( sockscmd, 0, 9 );

	sockscmd[0]			= 4; // версия. socks 4
	sockscmd[1]			= 1; // команда
	memmove( &sockscmd[2], &sin_port, 2 ); // порт инет-хоста
	memmove( &sockscmd[4], &sin_addr, 4 ); // его инет-адрес

	_send( sock, (_BYTE *) sockscmd, 9 , 0, 1 );
	int num = _recv( sock, (_BYTE *) sockscmd, 8, 0 , 1);
	if ( num != 8 || sockscmd[1]!=90 )
	{
		printf("Socks request failed. Press any key ...\n");
		closesocket(sock);
		WSACleanup();
		getch();
		return -1;
	}
	printf("Socks request success.\n");

И последнее, я выше постил про то, что таким образом можно на любой из портов. Не нравится "нестандарный" сервис - так у вас теперь практически действующий пример использования стандартного smtp. Пусть аналогичная прога у Ваших кастомеров автоматически шлёт статистику по smtp на Ваш сервер. Канва есть - дальше можно наворачивать.


ПС. При тестовой компилляции и проверке примера выше замените "192.168.x.y" на адрес своего firewall, а _send/_recv на стандартные send / recv. У меня эти функции написаны давно на select - aх. И вычитывается ровно столько, сколько необходимо. В примере, что выше не стал править. Там можно задавать тайм-ауты. В принципе, при программировании для интернет, думаю, всем необходимо задавать тайм-ауты. Конечно, в реальной задаче надо будет обрабатывать ошибки чтения/записи, уметь читать некую конфигурационную инфу на клиентах. Но это мелочи.
Ответить