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

 

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

Пишу приложение клиент-сервер на 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.


 

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

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

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

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

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


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

 
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;
}
//---------------------------------------------------------------------------
 

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

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

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

000000380000AACC00005823

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

 

почему ?

char * strin=  argv[argc-1];
 
sergeev:

почему ?


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

к примеру

Project1.exe 192.168.0.205 62000 000000380000AACC00005823

 

вы не поняли.

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

 
sergeev:

вы не поняли.

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

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

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

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

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

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

 

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

 
Допустим, преобразовали. Нолики в начале строки не обломают всю малину?
 
Integer:
Допустим, преобразовали. Нолики в начале строки не обломают всю малину?

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

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

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