Page 2 of 2 FirstFirst 1 2
Results 16 to 19 of 19

Thread: Client/Server Packet Lengthe

  1. #16
    Ja ik heb alles veranderd .
    Project wat ik tot nu toe heb, ik dnek dat een foutje zit bij de server en bij de client want die ontvangt alles en correct wat de server stuurt.
    https://www.mediafire.com/?mcoiq56i10mem33

  2. #17
    Eerst even het begin. Je verzend een CustomPacketHeader met daaraan vast een unicodestring (2 bytes per chars).
    Vervolgens stop je het geheel in een tempStr. Alleen doe je dan een SetLength() voor die tempStr van de totale lengte van je packet.
    Dat betekend dat ook de CustomPacketHeader size * 2 gedaan wordt.

    In mijn voorbeeld... Je CustomPacketHeader is 6 bytes.
    Je string is 28 karakters.
    Je totale dwLen (packetlengte) is 6 {header} + 28 * 2 {unicodestring} = 62
    Om dit geheel in een tempStr te zetten doe jij SetLength(tempStr, 62).
    Maar dat zijn echter 62 * 2 = 124 bytes !!

    Afgezien dat het niet mooi is dat je de header (met e.v. #0) in een string zet moet je dus dit doen:
    SetLength(tempStr, dwLen div 2);
    Dat zijn er dan 3 characters (dus 6 bytes) voor de header en 28 characters voor de rest van de string.

    Zie je nu waar het mis gaat?

    Ik heb onderstaande routine even aangepast dat je dus SetLength goed doet.

    Maar ook bij Delete() gaat het mis (2x).
    Jij doet Delete(sData, 1, SizeOf(TCustomPacketHeader)) maar die haalt dus 6 characters (van 2 bytes = 12 bytes) van de string af.
    Maar de CustomPacketHeader was maar 3 characters (= 6 bytes) dus je had Delete(sData, 1, SizeOf(TCustomPacketHeader) div 2) moeten doen.
    (heb ik hier ook aangepast, ook de Delete(sData, 1, dwPacketSize) die dus div 2 moet)

    Delphi Code:
    1. Function TClientThread.GetPacket(sSocket: Integer; sPass: String): String; // hier gaan we kijken of we een volledige packet ontvangen of niet
    2. Var
    3.   bArr: array [0 .. 4095] of Byte;
    4.   bByte: Byte;
    5.   tempStr, sData: String;
    6.   dwLen: Integer;
    7.   dwPacketSize, dwRealLen: Cardinal;
    8.   pPointer: Pointer;
    9. Begin
    10.   Repeat
    11.     ZeroMemory(@bArr[0], 4096);
    12.     dwLen := recv(sSocket, bArr[0], 4096, 0);
    13.     if (dwLen <= 0) then break;
    14.     SetLength(tempStr, dwLen div 2);  // KARAKTERS !!
    15.     MoveMemory(@tempStr[1], @bArr[0], dwLen);
    16.     sData := sData + tempStr;
    17.     Repeat
    18.       pPointer := @sData[1];
    19.       dwPacketSize := LPSocketHeader(pPointer)^.dwPackLen;
    20.       dwRealLen := Length(sData) * 2 - SizeOf(TCustomPacketHeader);
    21.       If dwPacketSize <= dwRealLen then
    22.       begin
    23.         bByte := LPSocketHeader(pPointer)^.bPackType;
    24.         Delete(sData, 1, SizeOf(TCustomPacketHeader) div 2);  // KARAKTERS !!
    25.         tempStr := Copy(sData, 1, dwPacketSize);
    26.         Delete(sData, 1, dwPacketSize div 2); // KARAKTERS !!
    27.         ParseCommand(sSocket, bByte, tempStr);
    28.         tempStr := '';
    29.       end
    30.       else break;
    31.     until sData = '';
    32.   until 1 = 3;
    33. end;

    Tot zo ver het ontvangen van de initiële pakketten.

    Ik denk echter dat het verkeerd is om de CustomPacketHeader in die tempStr te zetten. Die kan #0 bevatten en eigenlijk moet je daar geen string voor misbruiken. Je zou eigenlijk eerst de CustomPacketHeader moeten lezen uit bArr en dan de rest van bArr in de tempStr plaatsen. Maar dat gaat mij te veel tijd kosten om dat voor jou te doen (misschien dat iemand anders een poging kan wagen).

    Name:  a01.png
Views: 89
Size:  12.1 KBClick image for larger version. 

Name:	a02.png 
Views:	79 
Size:	11.8 KB 
ID:	7561

    Verder heb je in de rest van de communicatie ook allemaal SetLength() die verkeerd zijn.
    Als ik in de Server deze aanpas
    Delphi Code:
    1. Procedure ParseCommand(sSocket:TClientSocket);
    2. ...
    3.       SetLength(sBuff,lRecvLen div 2); // <---- Deze
    dan krijg ik uiteindelijk wel goede communicatie.

    Click image for larger version. 

Name:	a03.png 
Views:	78 
Size:	12.2 KB 
ID:	7562

    Maar zoals gezegd... dit is behoorlijk "lapwerk" (maar het werkt wel).

  3. #18
    Heel erg bedankt voor de aanpassingen die je hebt gedaan, ik heb wat aangepast bij de server en nu werkt het perfect

  4. #19
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    ...even voor het nageslacht je vernieuwde code uit post #16 op ons forum gezet ipv een sharehoster.
    Attached Files Attached Files
    TMemoryLeak.Create(Nil);

Page 2 of 2 FirstFirst 1 2

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •