1

Тема: Программирование. Как сделать сервер дома?

Итак. Поделюсь что я смог собрать. Хотелось бы чтобы далее кто-то подсказал.
Для того чтобы сделать из своего компьютера сервер вам обязательно потребуется программа сервер. Конкретно запускаемый *.ехе, который будет слушать порт, принимать информацию от трекера и выводить ее хотябы на экран в текстовом виде.
Для настройки трекера вам обычно нужно знать IP (адрес компьютера - он выдается провайдером и вы можете узнать его поиском в гугле введя "узнать совой IP")
Далее нужно указать Порт - это проще говоря произвольное число, такой себе пароль, благодаря которому трекер определит к какой программе на вашем компьютере ему обратится для работы. (ну почти произвольное, есть список портов уже занятых стандартными программамми)

Все что я на данный момент смог сделать - это найти пример TCP сервера на С++. подробный пример сервера я нашел по ссылке http://www.insidepro.com/kk/006/006r.shtml. -> Пример реализации TCP эхо-сервера
по умолчанию будет слушаться порт 666.
Что я смог добиться - это
http://s.qip.ru/2049a7O.jpg

т.е. крекер все же соединился с компьютером. Однако строчки с протоколом я так получить и не могу. Если кто-то подскажет чего не хватает?

2

Re: Программирование. Как сделать сервер дома?

Дык, не хватает как раз таки вывода информации в консоль. Принцип работы эхо-сервера - что получил от клиента, то ему и отправил smile
В Вашем примере интересует функция SexToClient (название забавное), которая обрабатывает полученные от клиента данные smile (спасибо кэп)
char buff[20 * 1024]; - определяет буфер сообщений, в данном случае - 20кб.

send(my_sock, sHELLO, sizeof(sHELLO), 0); - эту строку вообще закоментировать, нам не надо пока что ничего отправлять клиенту.

Вместо этой строки send(my_sock, &buff[0], bytes_recv, 0); надо выводить информацию на экран в вашу консоль
printf("Bytes received: %d\n", bytes_recv);
вот как-то так.. Студию ставить лениво, так что проверяйте сами, потом отпишите smile

Все, что нельзя написать на ассемблере, можно доделать паяльником (ц)

3

Re: Программирование. Как сделать сервер дома?

вот спасибо. уже шаг. Пишет Bites received: 28, потом 12... и так каждую минуту.
я вначале так и понял, что оно ничего не выводит а только отвечает. Не нашел printf для вывода информации.
у вас правда только колво байт выводит - хотя тоже результат smile . Действительно каждую минуту (как настроен трекер) приходит посылка.
Добавил     printf(&buff[0], "Bytes received: %d\n", bytes_recv); просто экспериментировал. Текстовая строка с координатами пришла, но далее после строчки непонятно.. забивает весь экран.

Отредактировано Mars (11-02-2012 22:34:11)

4

Re: Программирование. Как сделать сервер дома?

ну так протокол бинарный, переводите в hex, выкладывайте тут smile

Все, что нельзя написать на ассемблере, можно доделать паяльником (ц)

5

Re: Программирование. Как сделать сервер дома?

http://s.qip.ru/3049agv.jpg
вот такая дальше информация. Сначала цыфры, а потом весь экран в палках.. что это - непонятно. Или обрезать нужно или дешифрировать что оно есть? sad

Отредактировано Mars (11-02-2012 22:52:40)

6

Re: Программирование. Как сделать сервер дома?

посмотрите в сторону размера буфера. Или поэкспериментируйте с nc.

Отредактировано alexdob (14-02-2012 10:02:14)

Все, что нельзя написать на ассемблере, можно доделать паяльником (ц)

7

Re: Программирование. Как сделать сервер дома?

Не совсем понимаю у кого протокол закрытый. У око-авто (с которым я экспериментирую) есть подробное описание протокола -он якобы открытый.
Про сервер конечно здесь не этично. Действительно перелопатил кучу форумов программистов, особых ответов нет. Есть пример чатов.. но тоже половину нужно додумывать самому. Хоть что-то нашел благодаря крохам информации здесь.

8

Re: Программирование. Как сделать сервер дома?

тьфу, я думал Вы протокол М2М разбираете smile ну тогда киньте ссылку на описание протокола Вашего устройства

Все, что нельзя написать на ассемблере, можно доделать паяльником (ц)

9

Re: Программирование. Как сделать сервер дома?

http://forum.gps-tracker.com.ua/viewtop … 56&p=2
сообщение №30
Но только нюанс. Когда спутников не видит, вот эта посылка небольшая. Трекер чтобы не тратить байты ничего не отсылает. А у мя ща в гараже моц, по этому спутников не видно и посылка короткая.
по описанию: посылка заключена только в { } за скобочками уже ничего не должно быть. По этому непонятно откуда ироглифы после скобочек.

10

Re: Программирование. Как сделать сервер дома?

Где-то ошибка в выводе информации на экран. Прововал клиента создать по тому же примеру. При отправке сообщения после тектса аналогично экран забивается. А сейчас ищу как в visual C++ перевести это к красивой обертке с помощью MFC AppWizard. Трудновасто найти взаимодействие кода написанного для черного экрана и чтобы это выводить в красивые виндосовские окна MFC smile

11

Re: Программирование. Как сделать сервер дома?

По рекомендациям попробовал прыгнуть в С#. Архитектура конечно гораздо удобней и кажется проще. И наконец нашел исходник для сервера. В примере правда не хватает одной скобочки } . Но строку от трекера принимает без мусора.  smile

http://www.testingreflections.com/node/view/5763

12

Re: Программирование. Как сделать сервер дома?

потихонь научился принимать данные, сохранять в файл, и даже формировать фал html с маркерами на гугле. Застопорился как сделать чтобы они динамически появлялись, т.е. без перезагрузки страницы может кто подскажет?

13

Re: Программирование. Как сделать сервер дома?

AJAX - на странице js скрипт периодически дергает данные с сервера например в формате xml
websockets - более лучшее решение, отсылает уведомления клиенту при изменении данных (обзор или в педивики или тут http://habrahabr.ru/blogs/webdev/79038/ например)

Все, что нельзя написать на ассемблере, можно доделать паяльником (ц)

14

Re: Программирование. Как сделать сервер дома?

Ох... конкурента ростим  cool

15

Re: Программирование. Как сделать сервер дома?

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

Все, что нельзя написать на ассемблере, можно доделать паяльником (ц)

16

Re: Программирование. Как сделать сервер дома?

alexdob пишет:

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

я слежу за темой никуда не пропадаю.
Код уже тот ни к чему разбирать для вижуал си. Посоветовали в С# .net - там все проще, не нужно cтолько мусорных строк писать.  Програмно уже могу принимать протокол, запись в файл делать. Фильтровать что мне нужно (конкретно око протокола). Высвечивать свои маркеры на карте гугл. Но вот загвоздка так и остается, как добавлять точки динамически без перезагрузки страницы.
Файл с координатами и параметрами я формирую, можно сформировать програмно файл html куда в свою очередь подкачивать данные, но чтобы появлялись точки нужно обновлять всю страницу. Не совсем понятно как аякс работает и можно ли его связать с API гугл?  roll

17

Re: Программирование. Как сделать сервер дома?

кстати, тот пример для вижуал си принимает много клиентов. Пример для C# действительно одного, но мне пока больше не надо. Потом можно под асинхронный сервер дополнить. Пока с динамическим гуглем не могу решить задачу. У меня ж в программировании ноль опыта. По сему, куда не кинешься нужно выполнять хоть несколько уроков. tongue

Отредактировано Mars (22-02-2012 04:04:12)

18

Re: Программирование. Как сделать сервер дома?

Дык, все просто, как детей делать ))
Ваш сервер для логирования информации от клиентов будет так же и http сервером. При обычных запросах будет отдавать статический файл с диска (сформированную страницу с html кодом и JS\CSS), а при запросе на спец адрес - выдавать динамическое содержимое (JSON, XML, что-то другое)

На странице будет стоять примерно такой JS (простейший вариант)

var lastUpdate = 0;
var timeout = 5;
var dataUpdater = null;

function createObject (type, point, style, description) {
    var allowObjects = ["Placemark", "Polyline", "Polygon"],
    index = YMaps.jQuery.inArray( type, allowObjects),
    constructor = allowObjects[(index == -1) ? 0 : index];
    description = description || "";
    var object = new YMaps[constructor](point, {style: style, hasBalloon : !!description});
    object.description = description;
    return object;
}

function getData() {
    $.getJSON('localhost:9090/test.json', {lastUpdate: lastUpdate}, function(data) {
        $.each(data.points, function(i, point){
            map.addOverlay(createObject("Placemark", new YMaps.GeoPoint(point.x,point.y), "constructor#pmdolPlacemark", point.text));
        });
        lastUpdate = intval(data.lastUpdate) || 0;
    });
}

YMaps.jQuery(window).load(function(){
    dataUpdater = setInterval(getData, timeout * 1000);
}).unload(function(){
    clearInterval(dataUpdater)
});

(код не проверял, могут быть ошибки. unload на всякий случай smile )

формат выхлопа от сервера например так:

{lastUpdate:123456789,points:[{"x":"123.456","y":"1234.5678","text":"some text can be here"},{"x":"123.456","y":"1234.5678","text":"some text can be here"},{"x":"123.456","y":"1234.5678","text":"some text can be here"}]}

lastUpdate - какая-либо метка для контроля актуальности передаваемых данных. В данном примере контроль производится со стороны сервера.

пример дан для Яндекс.Карт, при большом кол-ве точек необходимо вместо координат передавать хэши.

Направление дал, работайте, спрашивайте, демонстрируйте smile просматриваю регулярно, отвечаю редко sad но отвечаю.

P.S. пример многопоточного HTTP сервера для С# http://www.coding4.net/post/multithread … sharp.aspx

Все, что нельзя написать на ассемблере, можно доделать паяльником (ц)

19

Re: Программирование. Как сделать сервер дома?

Мне кажется что делать из парсера еще и веб сервер как - то нелогично. Зачем изобретать велосипед? smile
ИМХО лучше поставить апач и под ним уже пусть работает php/html/javasctipt. А обмен данными реализовать через БД

20

Re: Программирование. Как сделать сервер дома?

не совсем понимаю взаимодействия сервера и все что с ним связано.
Я себе представляю  в подобном виде.
Создаю Html файл. Этот файл содержит ява скрипт который загружает мапу с гугля. Так же я прописал чтобы подгружался другой файл (файл с текстовой информацией track.txt) пока там два параметра: координата для центра карты и координата для маркера. Вот этот файл txt я могу формировать отдельно с помощью програмки/сервера . Можно конечно кучу параметров высвечивать но пока оставил один (точнее два - долгота и широта). Хотелось бы чтобы при открытии html файла (каким-нить браузером) просто по таймеру допустим раз в секунду опрашивался мой файл txt и добавлял маркеры. Как куда вставлять аяксовский скрипт - не могу это. Ну и нужно еще рядом держать файл jquery.js. Как-то все запутано.
Пример html кода для высвечивания карты

<!DOCTYPE html>
<html DIR="LTR">
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"  /> <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>Пример Google Maps JavaScript API v3: простой маркер</title>
<link href="http://code.google.com/apis/maps/documentation/javascript/examples/default.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false">
</script>

<script type='text/javascript' src='track.txt'>
</script>
<script type="text/javascript">

  function initialize() // задаем параметры карты
  {
     
    var myLatlng = new google.maps.LatLng(shirotamap,dolgotamap); // координата центра карты
    var myOptions = 
    {
      zoom: 16,
      center: myLatlng,
      mapTypeId: google.maps.MapTypeId.HYBRID
    }
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
  
var markPosition = new google.maps.LatLng(55.7040,37.6934); // координата маркера
var MarkerImage = new google.maps.MarkerImage("icon.png", new google.maps.Size(20, 20),  new google.maps.Point(0,0), new google.maps.Point(10,0)); //параметры своего маркера, icon.png рисунок маркера
var marker = new google.maps.Marker    ({ position: markPosition,   map: map, icon:MarkerImage, title:"Hello World!" });  //ставим маркер на карту

 
 }
</script>
</head>
<body onload="initialize()">
 <div id="map_canvas"></div>
</body>
</html>

то что содержится в track.txt файле (или js его можно обозвать, я так понял не важно, главное что он текстовый все равно).

var shirota = 55.7040;
var dolgota = 37.6934;

var shirotamap = 55.7040;
var dolgotamap = 37.6934;

21

Re: Программирование. Как сделать сервер дома?

GLuka пишет:

Мне кажется что делать из парсера еще и веб сервер как - то нелогично. Зачем изобретать велосипед? smile
ИМХО лучше поставить апач и под ним уже пусть работает php/html/javasctipt. А обмен данными реализовать через БД

вот вы говорите опять незнакомым мне языком big_smile . Я не программист. Денвер установил чтобы тестировать связку с PHP примерами.
Что имеется в виду под БД?

22

Re: Программирование. Как сделать сервер дома?

PHP я так понимаю нужен для того чтобы вносить изменения непосредственно на страничке открытой в браузере  и иметь возможность сохранять эти данные на сервере (чтобы при следующем открытии странички данные были именены). Пока для понимания без РHP хотябы сделать.

http://files.mail.ru/PY2CZI вот кстати програмка, она только принимает данные от трекера. Рядом папочка создается и записывает ту строчку протокола что присылает трекер. Тут на форуме есть и получе версия )) да и в инете есть демо програмка для трекеров (работает правда ограниченное время).  smile

23

Re: Программирование. Как сделать сервер дома?

GLuka пишет:

Мне кажется что делать из парсера еще и веб сервер как - то нелогично. Зачем изобретать велосипед? smile
ИМХО лучше поставить апач и под ним уже пусть работает php/html/javasctipt. А обмен данными реализовать через БД

в имеющейся сейчас реализации возможно два варианта:
- парсер является сервером.
- парсер только парсер. Он складывает данные в файл, который отдает внешний web-сервер (таким образом мы типа создаем модульную структуру)
модульная структура приложения это конечно правильно.. но для обучения\понимания, ИМХО, лучше все таки все в одном. А позже уже разбивать на модули и компоненты.

Вечером постараюсь выложить пример реализации второго варианта, только скиньте мне пару десятков пар точек. Ну если не сложно.

Все, что нельзя написать на ассемблере, можно доделать паяльником (ц)

24

Re: Программирование. Как сделать сервер дома?

Прастите что долго не пишу.
Хотел реальные координаты наездить. Снег с улиц сошел, откопал гараж завел проехал. Возится еще и возится. Отфильтровал долготы широты но оказалось не верно. Не было достоверного протокола ОКО. Сегодня записал достоверные данные живые. Ошибся только с символами, какие записывать в долготу широту. ОКО протокол какойто плаваюший. В примере 4знака после точки в определении широты, а на самом деле аж 6знаков. Отсюда и ошибка. Я их выбирал по порядку программой. А нужно от символа "А," до "N," и до "E".
Потом оказалось что мой серверок не возобновляет соединение в случае обрыва. Т.е. он ловит одно соединение и занимает его. При обрыве связи от клиента програмка повторно не ловит соединение - тоже ищу как цикл обрывать. А то он у меня все время true и естественно уже не выходит из него. При обрыве заново порт не начинает прослушивать.

25

Re: Программирование. Как сделать сервер дома?

Никак не реши проблему как определять отвалившегося клиента.

public class TCPServer
{
    public static void Main()
    {
        int port = 3128;
        Console.WriteLine("Server is running");
        Console.WriteLine("Listening on port " + port);
        Console.WriteLine("Waiting for connections...");

        IPAddress ipAddress = IPAddress.Any;
        TcpListener listener = new TcpListener(ipAddress, port);
        listener.Start();
        while (true)
        {
            Socket s = listener.AcceptSocket();

            while (true)
            {

               Console.WriteLine("соединение установлено");
               
                byte[] b = new byte[65535];

                int k = s.Receive(b);

                int i;

                for (i = 0; i < k; i++)
                {
                    Console.Write(Convert.ToChar(b[i]));

                }
                Console.WriteLine("");
                if (k == 0) break;

            }
            s.Close();
            Console.WriteLine("Разорвано");

            
        }
       
           
     
    }
}

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