Автоматический upload данных по Internet
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
-
- Частый Гость
- Сообщения: 26
- Зарегистрирован: 21 фев 2003, 11:42
- Откуда: Toronto
Автоматический upload данных по Internet
Дано:
- Несколько десятков кастомеров, во многих странах мира.
- У каждого катомера стоит наша софтина (на Windows 2000 Professional), которая в числе прочего пишет результаты измерений в ASCII лог файлы. Каждый лог файл размером 1-4М, за год может "набежать" 300-400М этих файлов.
- Периодически наши сотрудники звонят кастромерам по Pc-anyware и скачивают интресущие их логи (чтобы потом строить графики в Excel).
- Кастомеры очень параноидальны на счет Network Security.
Задача:
Написать софтину (или можеть есть готовая), котрая будет бежать у каждого кастомера и периодически (каждый час) будет пересылать последние изменения в лог файлах (за час накопится 30-40К) в офис нашей вирмы в GTA.
С учетом параноидальности кастомеров HTTP выглядит предпочтительнее. Т.к. это все бежит на Microsoft, до думаю в направлении .Net Web Services. Что порекомендуют многоопытные люди?
Критерии следующие:
- Легкость уламываания кастомеров на предмет и Network Security
- Наименьший геморй с написанием, сопровождением и деплойментом
- Ну и чтоб работало
- Несколько десятков кастомеров, во многих странах мира.
- У каждого катомера стоит наша софтина (на 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
заливание файла к вам через ФТП, ХТТП самое простое что можно придумать, делается за деньleonid писал(а):Дано:
- Несколько десятков кастомеров, во многих странах мира.
- У каждого катомера стоит наша софтина (на Windows 2000 Professional), которая в числе прочего пишет результаты измерений в ASCII лог файлы. Каждый лог файл размером 1-4М, за год может "набежать" 300-400М этих файлов.
- Периодически наши сотрудники звонят кастромерам по Pc-anyware и скачивают интресущие их логи (чтобы потом строить графики в Excel).
- Кастомеры очень параноидальны на счет Network Security.
Задача:
Написать софтину (или можеть есть готовая), котрая будет бежать у каждого кастомера и периодически (каждый час) будет пересылать последние изменения в лог файлах (за час накопится 30-40К) в офис нашей вирмы в GTA.
С учетом параноидальности кастомеров HTTP выглядит предпочтительнее. Т.к. это все бежит на Microsoft, до думаю в направлении .Net Web Services. Что порекомендуют многоопытные люди?
Критерии следующие:
- Легкость уламываания кастомеров на предмет и Network Security
- Наименьший геморй с написанием, сопровождением и деплойментом
- Ну и чтоб работало
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
На сокетах. Преимущество - всё очень прозрачно, жёвано-пережёвано.
У клиентов - клиенты. На серверах, куда сливается статистика - догадайся, что?
Пишется - не могу сказать сколько, ибо у каждого программера "болванки" уже давно написаны для аналогичных задач.
Кто за полдня напишет, кто за день. Кто за день - а скажет и потребует бабки за месяц работы
Ну, на тестирование - ну, неделя.
С портированием тоже не будет проблем, если использовать интерфейс Беркли.
Вот.
ПС. А вообще Vovka прав. Хоть и дубово, и потребует напряжения свех сил и фибр души сотрудников удалённых контор - но железное решение.
У клиентов - клиенты. На серверах, куда сливается статистика - догадайся, что?

Пишется - не могу сказать сколько, ибо у каждого программера "болванки" уже давно написаны для аналогичных задач.
Кто за полдня напишет, кто за день. Кто за день - а скажет и потребует бабки за месяц работы

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

-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
-
- Частый Гость
- Сообщения: 26
- Зарегистрирован: 21 фев 2003, 11:42
- Откуда: Toronto
А сокет-сервер будет слушать порт 80, и кастомер будет думать что связь идет по HTTP?vg писал(а):На сокетах.
Кастомера напрягать не годится, он вообще не обязан знать где наши логи находятся. И раз в месяц слишком редко.vg писал(а):Пусть посылают Вам файло с некоторой периодичностью (скажем, раз в месяц) - мылом.
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
leonid,
Серверный сокет будет слушать порт, который Вы укажите в bind после создания сокета, например, 60. Клиент будет коннектиться именно к этому порту.
Очень упрощённо (эта ремарка не Вам, а данило-сокето-мастерам-злопыхателям):
Серверная сторона
Здесь как назначите в макро SERVERPORT значение порта, так будет,
например,
#define SERVERPORT 60
Вы что - смеётесь? Кто говорил про 80 порт?vg:
На сокетах.
А сокет-сервер будет слушать порт 80, и кастомер будет думать что связь идет по HTTP?

Серверный сокет будет слушать порт, который Вы укажите в bind после создания сокета, например, 60. Клиент будет коннектиться именно к этому порту.

Очень упрощённо (эта ремарка не Вам, а данило-сокето-мастерам-злопыхателям):
Серверная сторона
Код: Выделить всё
...
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))
{
//обрабатываем
...
}
....
например,
#define SERVERPORT 60
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
2leonid, Vovka,
Опять же думаю, Вовка прав. На фпт можно заливать файло не "руками" Ваших кастомеров, а написать специализированного фтр-клиента.
Такой клиент в соответствии в определённым Вами шедул будет только отправлять на Вас фтп-сервер статистику.
Примеров исходников фтп-клиентов - море в инете.
С безопасниками Ваших кастомеров договариваться легко - они в ACL разрешат только трафик фтп-клиента. Обычная практика. Если у них (безопасников) и возникнут параноидальные сомнения, мол, а не троян ли у нас - предоставьте им сорсы клиентского ПО.
ПС.
Кстати, на бейсике тоже можно написать (сам не писал, но видел сорсы). Клёвость в этом заключается в дополнительных аргументах у Вас в разговоре с безопасниками-параноиками Ваших клиетов. Как правило параноики - безграмотные, и кроме бейсика ничего не знают. Да и бейсик тольком не знают. Отдадите им VB-сорсы - они будут спать спокойно.
Опять же думаю, Вовка прав. На фпт можно заливать файло не "руками" Ваших кастомеров, а написать специализированного фтр-клиента.
Такой клиент в соответствии в определённым Вами шедул будет только отправлять на Вас фтп-сервер статистику.
Примеров исходников фтп-клиентов - море в инете.
С безопасниками Ваших кастомеров договариваться легко - они в ACL разрешат только трафик фтп-клиента. Обычная практика. Если у них (безопасников) и возникнут параноидальные сомнения, мол, а не троян ли у нас - предоставьте им сорсы клиентского ПО.
ПС.
Кстати, на бейсике тоже можно написать (сам не писал, но видел сорсы). Клёвость в этом заключается в дополнительных аргументах у Вас в разговоре с безопасниками-параноиками Ваших клиетов. Как правило параноики - безграмотные, и кроме бейсика ничего не знают. Да и бейсик тольком не знают. Отдадите им VB-сорсы - они будут спать спокойно.
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
2pank,
ПС. То, что возможно уже через 15 минут будет у тебя нормально работать на твоём сервере в локалке или 127.0.0.1 - ещё не показатель, что это будет работать у удалённых кастомеров автора топика. И будет ли вообще работать. Так, что 3 часа, думаю, это гипербола.
За три часа разместишь код у клиента?часа 3 отлаживать
ПС. То, что возможно уже через 15 минут будет у тебя нормально работать на твоём сервере в локалке или 127.0.0.1 - ещё не показатель, что это будет работать у удалённых кастомеров автора топика. И будет ли вообще работать. Так, что 3 часа, думаю, это гипербола.
-
- Частый Гость
- Сообщения: 26
- Зарегистрирован: 21 фев 2003, 11:42
- Откуда: Toronto
Дополнительные вопросы:
1. В случае с сокетами, как быть со всякими там прокси у клиентов? Небось руками все писать нужно и под каждый тип прокси-сервера "доводить". Сам никогда ничего для интернета не писал на сокетах, потому и спрашиваю. В локалке все должно работать нормально.
2. Аналогичный вопрос про фтп-клиента.
3. Можно ли сделать upload файла в HTTP (типа как они в yahoo mail atatchments подгружают). Я ничего путного про "HTTP file upload" в гугле найти не могу. Конечно можно содержимое файла "впихнуть" в HTML форму, тем более, что файл текстовый.
Я почему на HTTP "зациклился", уж очень аргумент заманчивый: "закрывайте на клиенте все что хотите, оствьте только выход в и-нет для IE". Или я не туда думаю?
1. В случае с сокетами, как быть со всякими там прокси у клиентов? Небось руками все писать нужно и под каждый тип прокси-сервера "доводить". Сам никогда ничего для интернета не писал на сокетах, потому и спрашиваю. В локалке все должно работать нормально.
2. Аналогичный вопрос про фтп-клиента.
3. Можно ли сделать upload файла в HTTP (типа как они в yahoo mail atatchments подгружают). Я ничего путного про "HTTP file upload" в гугле найти не могу. Конечно можно содержимое файла "впихнуть" в HTML форму, тем более, что файл текстовый.
Я почему на HTTP "зациклился", уж очень аргумент заманчивый: "закрывайте на клиенте все что хотите, оствьте только выход в и-нет для IE". Или я не туда думаю?
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
2leonid,
Для NAT - ничего делать и не надо + к тому, что в локалке, имхо. Если хост кастомера непосредственно смотрит в инет, то ничего делать не надо - всё как в локалке.
В отдельных случаях, только для MS ISA Server 2000, вроде как на клиенте достаточно установить ихнего firewall-клиента. Сам не пробовал. Но вряд ли на это стоит ориентироваться (очень уж специфическая штука).
Разумеется, придётся руками. Да при этом ещё надо учесть, что стоит у кастомеров в горле сетки: SOCKS 4, SOCKS 5 - сервера?1. В случае с сокетами, как быть со всякими там прокси у клиентов? Небось руками все писать нужно и под каждый тип прокси-сервера "доводить". Сам никогда ничего для интернета не писал на сокетах, потому и спрашиваю. В локалке все должно работать нормально.
2. Аналогичный вопрос про фтп-клиента.

В отдельных случаях, только для MS ISA Server 2000, вроде как на клиенте достаточно установить ихнего firewall-клиента. Сам не пробовал. Но вряд ли на это стоит ориентироваться (очень уж специфическая штука).
Ну, а что. Вполне здравая идея. Не мой профиль, не могу подсказать что-нить конкретное. Но здесь, на форуме много веб-архитекторов. Думаю, подскажут, как это лучше сделать, чтоб было "автоматически", как вы хотите.....Конечно можно содержимое файла "впихнуть" в HTML форму, тем более, что файл текстовый.
Я почему на HTTP "зациклился", уж очень аргумент заманчивый: "закрывайте на клиенте все что хотите, оствьте только выход в и-нет для IE". Или я не туда думаю?
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
- Vovka
- Завсегдатай
- Сообщения: 250
- Зарегистрирован: 18 фев 2003, 12:17
есть такой метод пост, по нему и ищи инфу например c# and post httpleonid писал(а):Дополнительные вопросы:
1. В случае с сокетами, как быть со всякими там прокси у клиентов? Небось руками все писать нужно и под каждый тип прокси-сервера "доводить". Сам никогда ничего для интернета не писал на сокетах, потому и спрашиваю. В локалке все должно работать нормально.
2. Аналогичный вопрос про фтп-клиента.
3. Можно ли сделать upload файла в HTTP (типа как они в yahoo mail atatchments подгружают). Я ничего путного про "HTTP file upload" в гугле найти не могу. Конечно можно содержимое файла "впихнуть" в HTML форму, тем более, что файл текстовый.
Я почему на HTTP "зациклился", уж очень аргумент заманчивый: "закрывайте на клиенте все что хотите, оствьте только выход в и-нет для IE". Или я не туда думаю?
главное чтобы на сервере все чики было, я и Хттп и ФТП писал
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
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. Таких примеров в инете море. И это уровень джуниор С-программера, по крайней мере, в совке. Пример, намеренно написан "размашесто" в учебных целях для ясности того, что делается:
В этом коде видно - то, что связано с SOCKS, и что обеспечивает "работу сквозь прокси" - это копейки. Здесь мы подконнектились к сокс-серверу в локальной сети 192.168.x.y:1080. Сказали, что дальше в инете будем "говорить" с майлером 194.67.23.10:25. А дальше всё делаем, как для локальной сети. Пишем и читаем в тот же сокет SOCKS-сервера:
И последнее, я выше постил про то, что таким образом можно на любой из портов. Не нравится "нестандарный" сервис - так у вас теперь практически действующий пример использования стандартного smtp. Пусть аналогичная прога у Ваших кастомеров автоматически шлёт статистику по smtp на Ваш сервер. Канва есть - дальше можно наворачивать.
ПС. При тестовой компилляции и проверке примера выше замените "192.168.x.y" на адрес своего firewall, а _send/_recv на стандартные send / recv. У меня эти функции написаны давно на select - aх. И вычитывается ровно столько, сколько необходимо. В примере, что выше не стал править. Там можно задавать тайм-ауты. В принципе, при программировании для интернет, думаю, всем необходимо задавать тайм-ауты. Конечно, в реальной задаче надо будет обрабатывать ошибки чтения/записи, уметь читать некую конфигурационную инфу на клиентах. Но это мелочи.
Интересно, какое Вы приняли решение?
Может Вы неправильно меня поняли? Я постил, что действительно нужно в общем случае знать особенности межсетевого экрана (в Канаде говорят 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;
}
Код: Выделить всё
#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х. И вычитывается ровно столько, сколько необходимо. В примере, что выше не стал править. Там можно задавать тайм-ауты. В принципе, при программировании для интернет, думаю, всем необходимо задавать тайм-ауты. Конечно, в реальной задаче надо будет обрабатывать ошибки чтения/записи, уметь читать некую конфигурационную инфу на клиентах. Но это мелочи.