Скачать MetaTrader 5

Помогите с приложением клиент-сервер

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Задействуй с пользой свободные компьютеры. Подключись к MQL5 Cloud Network!
Alexey Klenov
1883
Alexey Klenov 2012.11.14 08:23 

Люди помогите с одной загвоздкой.

Пишу приложение клиент-сервер на C++ билдере.

Есть строка AnsiString  00000042000053D100003821

это три числа 66, 21457, 14369 в HEX виде при длине 4 байта

Эту строку необходимо переслать на сокет, но так чтобы она пришла туда не как текст, а именно как HEX строка, то есть то что будет читаться в текстовом режиме на удаленном сокете это будут "каркозяблы" то есть символы соответствующие кодам 00 00 00 42 00 00 53 D1 00 00 38 21.

Как мне имея эту строку в билдере в виде AnsiString передать (или сначала конвертировать) чтобы она на конечный сокет пришла в виде HEX значений.

Использую winsock2.h из него создание сокета, соединение, отправка.

Спасибо. Может кончено это не столь специфический форум, но думаю программистов здесь много не только MQL.


o_o
Модератор
23714
o_o 2012.11.14 08:26  

вообще на сокет подаются по сути байты.

как выглядит функция отправки данных send у вас в С++ builder ?

я так понимаю как и у всех. оправляется байтовый буфер const char * buf

следовательно вы можете отправить ваши 3 переменные

send(SOCKET, &прм, sizeof(прм), 0)


в случае с UDP sendto аналоргично

Alexey Klenov
1883
Alexey Klenov 2012.11.14 09:23  
sergeev:


#include <vcl.h>
#include <iostream>
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <sstream>

using namespace std;

#pragma hdrstop
#pragma argsused
//---------------------------------------------------------------------------


int main(int argc, char* argv[])
{
    if (argc<3)
        {
                MessageBox(NULL,"\nIP\nport\nstrforSend",NULL,MB_OK);
                return (-1);
        }


    char * ipServer=   argv[1];
    char * _portServer=  argv[2];
    char * strin=  argv[argc-1];
    char  strsend[512];
    unsigned short portServer;
    std::stringstream ss(_portServer);
    ss >> portServer;


    WSADATA WsaData; //
    int err = WSAStartup (0x0101, &WsaData);
    cout<<ipServer<<" "<<portServer<<" "<<strin<<endl;
 
    if (err == SOCKET_ERROR) 
        {
                printf ("WSAStartup() failed: %ld\n", GetLastError ());
                return 1; 
        }

    SOCKADDR_IN sin; // "SOCKADDR_IN"

    sin.sin_family = AF_INET; 
    sin.sin_port = htons(portServer); 
    sin.sin_addr.s_addr = INADDR_ANY; 
    sin.sin_addr.S_un.S_addr=inet_addr(ipServer); 
    SOCKET s; 
    s = socket(AF_INET, SOCK_STREAM, 0); 

    err=connect(s,(struct sockaddr*)&sin, sizeof(sin)); 

    send(s, strin,strlen(strin),MSG_DONTROUTE);
    

    closesocket(s);
    WSACleanup();  

    return 0;
}
//---------------------------------------------------------------------------
Alexey Klenov
1883
Alexey Klenov 2012.11.14 09:24  

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

Думаю должно быть как то проще

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

000000380000AACC00005823

а получаю 303030303030333830303030414143433030303035383233 в читаемом виде.

o_o
Модератор
23714
o_o 2012.11.14 09:31  

почему ?

char * strin=  argv[argc-1];
Alexey Klenov
1883
Alexey Klenov 2012.11.14 11:07  
sergeev:

почему ?


Берем последний параметр с которым вызывается данный exe

к примеру

Project1.exe 192.168.0.205 62000 000000380000AACC00005823

o_o
Модератор
23714
o_o 2012.11.14 11:28  

вы не поняли.

я спрашиваю  - почему вы подаете инфу в таком неудобном строковом 16-виде ?

Alexey Klenov
1883
Alexey Klenov 2012.11.14 14:00  
sergeev:

вы не поняли.

я спрашиваю  - почему вы подаете инфу в таком неудобном строковом 16-виде ?

Данное приложение было необходимо как примочка к SCADA системе RSView32 в которой есть VBA но который не понимает AddresOf. Задача была передать данные с этой системы (несколько подряд за одну передачу) на удаленный сокет с которого прогина пришедшие данные парсит последовательно согласно задания типа первое число 2 байта, второе 4 байта, третье 2 байта...

но прогина воспринимает не текст а именно его HEX значения.

вот в качестве кастыля к этой SCADA дописал это приложение...

Сейчас задача подружить OPC сервер с тем же удаленным хостом. Софт для сбора данных с ОРС уже написал, теперь вот отправить нужно аналогично.

То есть выше это пример (обычный из интернета по принципу миниатюрного чата) хотел взять за основу, "но красивее" сделать..

o_o
Модератор
23714
o_o 2012.11.14 14:06  

моя логика не в состоянии... извините.

Dmitry Fedoseev
42924
Dmitry Fedoseev 2012.11.14 15:54  
Допустим, преобразовали. Нолики в начале строки не обломают всю малину?
Alexey Klenov
1883
Alexey Klenov 2012.11.14 18:35  
Integer:
Допустим, преобразовали. Нолики в начале строки не обломают всю малину?

Как не странно нет.

На картинке выше видно что в HEX нолики тоже приходят и не "зануляются"(не отбрасываются) и не важно сколько их там ноликов будет.

Но мой вариант это еще строчек 20 наверное в + к текущему коду. Вот и решил спросить на форуме у знающих людей.

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий