Przetłumaczenie kodu z użyciem Socketów z C++ na Delphi.

0

Witam czy mógłby mi ktos pomóc skonwertować kod C++ na Delphi ewentualnie jakoś lepiej wytłumaczyć jak go skonwertować.

 
#define VERSION_REQ                0x01

static    void    MP_AddByte(BYTE *dest, int& iOffset, BYTE byte) { 
       CopyMemory(dest+iOffset, &byte, 1);
       iOffset ++; 
}
static    void    MP_AddShort(BYTE *dest, int& iOffset, short value) { 
       CopyMemory(dest+iOffset, &value, 2);
       iOffset += 2; 
}
void Launcher::PacketSend_VersionReq()
{
    int iOffset = 0;
    BYTE byBuffs[128];
    memset( byBuffs, NULL, 128 );
    int m_nCurVersion=1234;

    m_pSocket->MP_AddByte( byBuffs, iOffset, VERSION_REQ );
    m_pSocket->MP_AddShort( byBuffs, iOffset , m_nCurVersion );
    
    m_pSocket->Send(byBuffs, iOffset);
}

0

Chce wysłać te 2 rzeczy do servera

VERSION_REQ
i
m_nCurVersion=1234;
</p>
0

Tak jak napisał @babubabu - Synapse pod VCL. A jeżeli kombinujesz pod kątem WinAPI. Albo chcesz mieć jak największą kontrolę nad pisaniem klienta/serwera TCP opartego o sockety, to polecam moduł Simple TCP, do pobrania wraz z przykładami użycia z : http://piechnat.pl/article/simpletcp.html - w tłumaczeniu nie pomoge, bo nie ogarniam za dobrze C++.

0

Juz kiedys robiłem proste aplikacje wysylajac dane przez sendtext ale w tym przypadku trzeba chyba uzyc sendbuff i wlasnie tutaj mam problem bo nigdy tego nie robilem i nie mam totalnie pomyslu jak wyslac te 2 zmienne

0

Ustal Snifferem co wysyła aplikacja, której kodu chcesz tlumaczyć i pod Simple TCP postaraj się wysłać identyczny pakiet. I chyba się nie przyjrzałeś Simple TCP, bo jak widać może on wysyłać Bufor nie koniecznie będący stringiem, jeżeli podamy jego rozmiar. Pokombinuj.

0

Mam tez source serwera ktore tez jest napisane w c++ i po stronie serwera odbieranie pakietu wyglada tak

void CUser::Parsing(int len, char *pData)
{
    int index = 0, send_index = 0, i=0, client_version = 0;
    char buff[2048]; memset( buff, 0x00, 2048 );
    BYTE command = GetByte( pData, index );

    switch( command ) {
    case LS_VERSION_REQ:
        SetByte( buff, LS_VERSION_REQ, send_index );
        SetShort( buff, m_pMain->m_nLastVersion, send_index );
        Send( buff, send_index );
        break;
0

Przy użyciu TClientSocket - wysłanie pakietu

procedure TForm1.Button1Click(Sender: TObject);
var
  Buffer: array of Byte;
  ReqVersion: Byte;
  CurrentVersion: SmallInt;
begin
  //Przydzielenie pamieci buforowi (3 bajty)
  SetLength(Buffer, 3);
  //ustawienie parametrow pakietu
  ReqVersion := 50;
  CurrentVersion := -3844;
  //przekopiowanie parametrow do bufora
  CopyMemory(@Buffer[0], @ReqVersion, 1);
  CopyMemory(@Buffer[1], @CurrentVersion, 2);
  //wyslanie bufora
  ClientSocket1.Socket.SendBuf(Buffer[0], 3)
end;

Zapewne protokół to 1 bajt typ pakietu, kolejne to właściwa część danych pakietu.

odbiór na serwerze tego pakietu mógłby w najprostszej postaci wyglądać tak:

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  ReqVer: Byte;
  CurVer: SmallInt;
begin
  Socket.ReceiveBuf(ReqVer, 1);
  Socket.ReceiveBuf(CurVer, 2);
  Memo1.Lines.Add('ReqVer: '+IntToStr(ReqVer)); // typ 
  Memo1.Lines.Add('CurVer: '+IntToStr(CurVer));  // dane
end;

Z tym, że pakiet może przyjść w częściach tzn. jeden pakiet może być podzielony na kilka mniejszych wtedy trzeba składać go w poszczególnych wywołaniach zdarzenia OnRead w całość. Kolejna sytuacja to gdy jedno zdarzenie OnRead może na raz odebrać "zlepione" pakiety i trzeba je rozdzielić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1