Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 5.00
amazingsoul
0 / 0 / 0
Регистрация: 28.07.2009
Сообщений: 37
#1

Связь по TCP - C++

28.07.2009, 13:42. Просмотров 4292. Ответов 25
Метки нет (Все метки)

Здравствуйте , уважаемые программисты.
Я начинающий программист и моя задача состоит в том, чтобы обеспечить связь сервера на котором установлена программа и микроконтроллера, которой по GSM-модему устанавливает TCP-соединение и передает некоторые данные.
Мне необходимо написать программу , которая бы могла слушать порт и принимать данные от контроллера, записывать их в файл. Почитал немного про Indy, но там похоже устанавливается связь Client-Server, то есть программа должна стоять на обоих устройствах. У меня программа ставится только на серверную машину.
Подскажите каким образом можно решить данную задачу , буду благодарен за любую помощь.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
amazingsoul
0 / 0 / 0
Регистрация: 28.07.2009
Сообщений: 37
30.07.2009, 22:21  [ТС]     Связь по TCP #21
Цитата Сообщение от vitaly1981 Посмотреть сообщение
Ну так бы сразу и написал. То есть ты пишешь две программы, клиент и сервер. Клиент дает команды модему, а модем организует TCP. Следовательно какие данные ты модему дал (кроме комманд) те данные сервер и получит. Поэксперементируй, придумай тот формат данных который более удобен для твоей конкретной ситуации. Каждый прикладной протокол подтачивается под конкретную задачу, поэтому примеры кода тебе не помогут, а только запутают. Ты конечно можешь взять за основу и smtp протокол...но оно тебе надо? ведь тебе всего то нужно передать какие то данные с клиента на сервер.
Например: клиент передает строку "HELLO", формируешь пакет 55 55 8 H E L L O.
Первые два числа признак начала пакета данных, 8 длина пакета, а дальше данные. Можно придумать еще множество параметров, например контрольную сумму, но все это зависит от твоей конкретной задачи.
Нашел решение в том , чтобы на машину поставить почтовый сервер с HTTP -протоколом и ведением журнала , единственное в чем проблема ту строчку что я вывожу через контроллер показывает пустым полем..как будто CR LF обычный
odip
Эксперт С++
7153 / 3293 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
30.07.2009, 23:05     Связь по TCP #22
Ну так покажи что делаешь и что пишется в лог.
solar_wind
752 / 743 / 41
Регистрация: 06.07.2009
Сообщений: 2,963
Завершенные тесты: 1
31.07.2009, 06:21     Связь по TCP #23
Цитата Сообщение от amazingsoul Посмотреть сообщение
Нашел решение в том , чтобы на машину поставить почтовый сервер с HTTP -протоколом и ведением журнала , единственное в чем проблема ту строчку что я вывожу через контроллер показывает пустым полем..как будто CR LF обычный
Так понятно, та строчка которую выдает тебе контроллер состоит скорее всего из кодов непечатных символов. И скорее всего их нельзя интерпретировать как символы, тебе нужно отображать коды в числовом или шестнадцатеричном виде.

Ну вот начали с написания программы, закончили логом почтового сервера.....
написал бы простенький TCP сервер и не извращался бы так.....я же тебе дал статью где все разжевано и есть готовые примеры.....
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
31.07.2009, 06:37     Связь по TCP #24
Цитата Сообщение от amazingsoul
как будто CR LF обычный
надо примимать байты и отображать потом тоже (потому что, даже если ты их увидишь, смысла в этом мало)
тебе приходит байт - ты на экран пишешь его признак "пришло такое-то сообщение"
тогда такой заморочки с обязательным наличием понятных для человека слов (типа команд серверу) не будет
amazingsoul
0 / 0 / 0
Регистрация: 28.07.2009
Сообщений: 37
01.08.2009, 02:37  [ТС]     Связь по TCP #25
Цитата Сообщение от accept Посмотреть сообщение
надо примимать байты и отображать потом тоже (потому что, даже если ты их увидишь, смысла в этом мало)
тебе приходит байт - ты на экран пишешь его признак "пришло такое-то сообщение"
тогда такой заморочки с обязательным наличием понятных для человека слов (типа команд серверу) не будет
Мне нужен не просто признак, моя задача состоит в том чтобы складывать эти данные в файлик , который будет потом анализироваться.

Добавлено через 2 минуты 31 секунду
Цитата Сообщение от vitaly1981 Посмотреть сообщение
Так понятно, та строчка которую выдает тебе контроллер состоит скорее всего из кодов непечатных символов. И скорее всего их нельзя интерпретировать как символы, тебе нужно отображать коды в числовом или шестнадцатеричном виде.

Ну вот начали с написания программы, закончили логом почтового сервера.....
написал бы простенький TCP сервер и не извращался бы так.....я же тебе дал статью где все разжевано и есть готовые примеры.....
Проблема в том, что если я подключаю модем и выхожу с компьютера в интернет через этот же модем,через терминальную программу даю команды посылки этих символов, то все пишется прекрасно. А если через контроллер, то приходит пустая строчка. Мне это непонятно. А по поводу сервера, зачем, если есть готовые программы,бесплатные и имеющие те функции, которые мне нужны
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2009, 05:51     Связь по TCP
Еще ссылки по теме:

Tcp/ip подключение к программе C++
TCP клиент, ошибка при компиляции C++
C++ Соединение tcp client и tcp server
C++ Можно ли по TCP отправить несколько JSON и принять соответственно?
отправка сообщений по TCP на одном компьютере C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.08.2009, 05:51     Связь по TCP #26
Цитата Сообщение от amazingsoul
Мне нужен не просто признак, моя задача состоит в том чтобы складывать эти данные в файлик , который будет потом анализироваться.
не, сначала нужно представить это в программе, а потом уже складывать в файл это представление
может даже складывать не придётся, анализ будет возможен прямо в программе

я так, примерно, накидаю
C
1
2
3
4
5
6
#define MAXBUF  1000
 
struct received {
    char buffer[MAXBUF];
    short length;
};
вот ты принимаешь данные в этот буфер, на лине
C
1
2
3
4
5
6
7
8
9
    struct received channel1;
    int n;
 
    n = read(
            socket,
            (void *) channel1.buffer,
            sizeof channel1.buffer
        );
    channel1.length = n;
теперь у тебя есть эта структура, в ней записаны все данные и их длина - можно разбирать

C
1
2
3
4
5
struct commands {
    short one;
    char two[5];
    unsigned long three;
};
C
1
2
3
4
5
6
7
#include <string.h>
 
...
    
    struct commands cmdlist;
 
    memcpy(&cmdlist, channel1.buffer, sizeof cmdlist);
потом можно брать уже каждую команду
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
...
 
    printf(
        "%hd"
        " "
        "%c"
        " "
        "%lu"
        "\n",
        cmdlist.one,
        *cmdlist.two,
        cmdlist.three
    );
Добавлено через 33 минуты 50 секунд
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct x {
        short one;
        char two[5];
        unsigned long three;
    };
    
    char buffer[100] = {
        0x0A, 0x0F,
        0x0B, 0x0B, 0x0C, 0x0C, 0x0A,  0x0A,
        0x1B, 0x0B, 0x0C, 0x0F,
         
        0x0A, 0x0A, 0x0B, 0x0B, 0x0C, 0x0C,
        0x0A, 0x0A, 0x0B, 0x0B, 0x0C, 0x0C,
    };
C
1
2
3
4
5
    struct x cmdlist;
 
    memset(&cmdlist, 0, sizeof cmdlist);
    
    memcpy(&cmdlist, buffer, sizeof cmdlist);
проверил у себя - там отметил, копируется всё до пустой строки, записывает в переменные в обратном порядке (вроде только char'ы идут прямо) и один байт идёт под заполнение
последнее unsigned long из
0x1B, 0x0B, 0x0C, 0x0F
превратится в
0x0F, 0x0C, 0x0B, 0x1B

там можно оборачивать при упаковке ещё или сразу после упаковки, чтобы они по сети пошли в нужном виде, чтобы при распаковке сразу читать
Yandex
Объявления
01.08.2009, 05:51     Связь по TCP
Ответ Создать тему
Опции темы

Текущее время: 22:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru