С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

Здравствуйте , уважаемые программисты.
Я начинающий программист и моя задача состоит в том, чтобы обеспечить связь сервера на котором установлена программа и микроконтроллера, которой по GSM-модему устанавливает TCP-соединение и передает некоторые данные.
Мне необходимо написать программу , которая бы могла слушать порт и принимать данные от контроллера, записывать их в файл. Почитал немного про Indy, но там похоже устанавливается связь Client-Server, то есть программа должна стоять на обоих устройствах. У меня программа ставится только на серверную машину.
Подскажите каким образом можно решить данную задачу , буду благодарен за любую помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2009, 13:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Связь по TCP (C++):

Соединение tcp client и tcp server - C++
accept(); bind(); connect(); listen(); socket(); Нужно расположить их в порядке в каком их вызывает (А) сервер (Б) клиент, чтобы...

Работа с TCP/IP протоколами - C++
Здравствуйте! Хочу реализовать свою идею. Но не знаю с чего начать. Подскажите пожалюста, на каком языке лучше написать такую прогу, или...

TCP клиент/сервер - C++
Здравствуйте, прошу вашей помощи) нашел реализацию TCP клиента/сервера, все работает, но есть одно "но". IP адрес в коде прописан через...

Tcp/ip подключение к программе - C++
Написал простое приложение сервер+клиент, передача данных осуществляется по протоколу tcp. Когда комп подключен к интернету (ip выдается...

Инкапсуляция пакетов TCP/IP - C++
Всем привет есть такой вопрос. Надо было написать протокол для программыки типа клиет-сервер. Фишка в том что я пищу только часть...

WinSock tcp client/server - C++
Может у кого то есть пример простой реализации client/server на winsock ? неважно на каком языке. Мне надо что бы сервер отправлял...

25
amazingsoul
0 / 0 / 0
Регистрация: 28.07.2009
Сообщений: 37
28.07.2009, 23:40  [ТС] #16
Цитата Сообщение от odip Посмотреть сообщение
Очень мутные объяснения. Я так и не понял - кто со стороны микроконтроллера управляет подключением к серверу ? Ты сам пишешь этот код для микроконтроллера или у него есть какой-то стандартный алгоритм ?
В начале темы ты пишешь, что можешь писать только код сервера.
Теперь оказывается тебе нужно самому передать данные и получается что ты пишешь и код клиента тоже.
Итак ,более подробно. Я пишу программу для контроллера , которая собирает данные с объекта и отправляет через GSM-модем посредством понятных ему AT-команд эти данные на сервер, на котором должна быть установлена другая программа обработки этих данных. То есть принятия их и записи в текстовый файл.
В итоге у меня есть программа для контроллера, которая умеет собирать данные с объекта и передавать через модем эти данные посредством TCP и есть компьютер на котором должна быть программа прослушивания и обработки этих данных.
Вот мне то и нужно написать такую программу на C++ для компьютера. А выдавать серверу я могу что захочу, любые текстовые команды, главное чтобы он их принял
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
29.07.2009, 00:04 #17
Ну в принципе тебе уже ответили - изучай сокеты и программирование с их использованием. Там есть примеры кода простейшего TCP-сервера. Протокол по типу SMTP придумай себе сам.
0
amazingsoul
0 / 0 / 0
Регистрация: 28.07.2009
Сообщений: 37
29.07.2009, 00:18  [ТС] #18
Цитата Сообщение от odip Посмотреть сообщение
Ну в принципе тебе уже ответили - изучай сокеты и программирование с их использованием. Там есть примеры кода простейшего TCP-сервера. Протокол по типу SMTP придумай себе сам.
А нет ли готовых программ, для того чтобы самому не тратить на это время?
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
29.07.2009, 03:41 #19
Цитата Сообщение от amazingsoul
Итак ,более подробно. Я пишу программу для контроллера , которая собирает данные с объекта и отправляет через GSM-модем посредством понятных ему AT-команд эти данные
это называется клиент

Цитата Сообщение от amazingsoul
на сервер, на котором должна быть установлена другая программа обработки этих данных. То есть принятия их и записи в текстовый файл.
Вот мне то и нужно написать такую программу на C++ для компьютера.
а это сервер

можно начать с любой, пишешь сервер, например, и ему телнетом закидываешь то, что будет потом клиент закидывать
по сети передаются просто потоки байт (символьные массивы), они формируются в клиенте по определённой системе, а потом сливаются в одно, когда сервер получает поток байт, он может его прямо в таком виде даже в файл сохранить, а может сразу разобрать на структуры; когда он отвечает - то же самое, у него есть структуры, он с них данные собирает в один поток и передаёт - клиент разбирает их там так же

то есть, соединение - это просто канал, чтобы эти байты передать, больше оно ничего не делает

Добавлено через 5 минут 55 секунд
ты в курсе, что сервер - это не такой компьютер, а такая программа ?
и что на компьютере сервере могут быть установлены клиенты, которые тоже такие программы
а на компьютерах клиентах могут быть установлены серверы, то есть тоже программы
0
solar_wind
757 / 748 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 1
29.07.2009, 06:15 #20
Цитата Сообщение от amazingsoul Посмотреть сообщение
Итак ,более подробно. Я пишу программу для контроллера , которая собирает данные с объекта и отправляет через GSM-модем посредством понятных ему AT-команд эти данные на сервер, на котором должна быть установлена другая программа обработки этих данных. То есть принятия их и записи в текстовый файл.
В итоге у меня есть программа для контроллера, которая умеет собирать данные с объекта и передавать через модем эти данные посредством TCP и есть компьютер на котором должна быть программа прослушивания и обработки этих данных.
Вот мне то и нужно написать такую программу на C++ для компьютера. А выдавать серверу я могу что захочу, любые текстовые команды, главное чтобы он их принял
Ну так бы сразу и написал. То есть ты пишешь две программы, клиент и сервер. Клиент дает команды модему, а модем организует TCP. Следовательно какие данные ты модему дал (кроме комманд) те данные сервер и получит. Поэксперементируй, придумай тот формат данных который более удобен для твоей конкретной ситуации. Каждый прикладной протокол подтачивается под конкретную задачу, поэтому примеры кода тебе не помогут, а только запутают. Ты конечно можешь взять за основу и smtp протокол...но оно тебе надо? ведь тебе всего то нужно передать какие то данные с клиента на сервер.
Например: клиент передает строку "HELLO", формируешь пакет 55 55 8 H E L L O.
Первые два числа признак начала пакета данных, 8 длина пакета, а дальше данные. Можно придумать еще множество параметров, например контрольную сумму, но все это зависит от твоей конкретной задачи.
1
amazingsoul
0 / 0 / 0
Регистрация: 28.07.2009
Сообщений: 37
30.07.2009, 22:21  [ТС] #21
Цитата Сообщение от vitaly1981 Посмотреть сообщение
Ну так бы сразу и написал. То есть ты пишешь две программы, клиент и сервер. Клиент дает команды модему, а модем организует TCP. Следовательно какие данные ты модему дал (кроме комманд) те данные сервер и получит. Поэксперементируй, придумай тот формат данных который более удобен для твоей конкретной ситуации. Каждый прикладной протокол подтачивается под конкретную задачу, поэтому примеры кода тебе не помогут, а только запутают. Ты конечно можешь взять за основу и smtp протокол...но оно тебе надо? ведь тебе всего то нужно передать какие то данные с клиента на сервер.
Например: клиент передает строку "HELLO", формируешь пакет 55 55 8 H E L L O.
Первые два числа признак начала пакета данных, 8 длина пакета, а дальше данные. Можно придумать еще множество параметров, например контрольную сумму, но все это зависит от твоей конкретной задачи.
Нашел решение в том , чтобы на машину поставить почтовый сервер с HTTP -протоколом и ведением журнала , единственное в чем проблема ту строчку что я вывожу через контроллер показывает пустым полем..как будто CR LF обычный
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
30.07.2009, 23:05 #22
Ну так покажи что делаешь и что пишется в лог.
0
solar_wind
757 / 748 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 1
31.07.2009, 06:21 #23
Цитата Сообщение от amazingsoul Посмотреть сообщение
Нашел решение в том , чтобы на машину поставить почтовый сервер с HTTP -протоколом и ведением журнала , единственное в чем проблема ту строчку что я вывожу через контроллер показывает пустым полем..как будто CR LF обычный
Так понятно, та строчка которую выдает тебе контроллер состоит скорее всего из кодов непечатных символов. И скорее всего их нельзя интерпретировать как символы, тебе нужно отображать коды в числовом или шестнадцатеричном виде.

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

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

Ну вот начали с написания программы, закончили логом почтового сервера.....
написал бы простенький TCP сервер и не извращался бы так.....я же тебе дал статью где все разжевано и есть готовые примеры.....
Проблема в том, что если я подключаю модем и выхожу с компьютера в интернет через этот же модем,через терминальную программу даю команды посылки этих символов, то все пишется прекрасно. А если через контроллер, то приходит пустая строчка. Мне это непонятно. А по поводу сервера, зачем, если есть готовые программы,бесплатные и имеющие те функции, которые мне нужны
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
01.08.2009, 05:51 #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

там можно оборачивать при упаковке ещё или сразу после упаковки, чтобы они по сети пошли в нужном виде, чтобы при распаковке сразу читать
0
01.08.2009, 05:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2009, 05:51
Привет! Вот еще темы с ответами:

Общение игрострой TCP/UDP - C++
Привет всем! Как написать чат, сериализовывать и десериализовывать я знаю. Передавать файлы по FTP. Тоже НЕ могу понять что передавать...

Обращение к сервисам IIS по net tcp - C++
добрый день. Прошу помощи в решении такой задачи.(руководство ставит задачу, не важно умеешь не умеешь - учись.) Суть вопроса. ...

TCP/IP передача писем от сервера клиенту - C++
Есть простейший почтовый сервер и почтовый клиент. Взаимодействие реализовано с помощью отправки констант, означающие например &quot;отправить...

отправка сообщений по TCP на одном компьютере - C++
Добрый день. Хочу сделать что то типа соединения клиент-сервер но на одном компьютере. Соответственно делаю соединение по адресу...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.