Solved: Client Server Send Data randomly corruption

Just starting out? Need help? Post your questions and find answers here.
LiK137
Enthusiast
Enthusiast
Posts: 282
Joined: Wed Jun 23, 2010 5:13 pm

Solved: Client Server Send Data randomly corruption

Post by LiK137 »

Hi,
I have made a simple code for partially sending data from Client To Server and very few times code runs correct but mostly data is being sent is corrupted and differs.
The purpose is sending structured data.
ServerPart:

Code: Select all

      ;{ Consts
        #DataBuff         = 2041
        
        Enumeration ;rawDAType
          #rawDAType_txtMSG  
          #rawDAType_audMSG  
          #rawDAType_photoMSG
          #rawDAType_vidMSG  
        EndEnumeration  
        
        Enumeration ;rcvStat
          #rcvStat1 = 1
          #rcvStat2 = 2
          #rcvStat3 = 3
          #rcvStat4 = 4
          #rcvStat5 = 5
          #rcvStat6 = 6
          #rcvStat7 = 7
        EndEnumeration  
      ;}
      ;{ Structs
          Structure rawData       
            iData.a[8]            
            szDataChunk.q         
            offseData.q          
            memData.a[2000]      
            crcData.a[8]         
            szData.q             
            rawDAType.b          
          EndStructure
          
          Structure clIDef        
            srvAuthID.q  
            cliAuthID.q      
            clCRet.i              
            clID.i                
            clIP.l                
            clPort.u            
            clGUIDnit.b         
            charMod.a             
          EndStructure  
          
          Structure srvDef         
            szBuff.u               
            srvCRet.i              
            srvID.i                
            srvPort.u              
            srvNETProto.l          
            srvTCPver.l            
            srvIPnterface.l        
            srvRUNstat.b           
            srvMAYdown.b           
            srvTERMsignal.b        
            szClients.l            
            hMemQLite.i 
            Map Clients.clIDef()   
          EndStructure            
      ;}
      ;{ Macros
        Macro peekaIData(MEM, IData)
          IData = Chr(PeekA(MEM))+Chr(PeekA(MEM+1))+Chr(PeekA(MEM+2))+Chr(PeekA(MEM+3))+Chr(PeekA(MEM+4))+Chr(PeekA(MEM+5))+Chr(PeekA(MEM+6))+Chr(PeekA(MEM+7))
        EndMacro  
        Macro peekqSZchunk(MEM, SZchunk)
          SZchunk = PeekQ(MEM+8)
        EndMacro  
        Macro peekqOFFset(MEM, OFFset)
          OFFset = PeekQ(MEM+16)
        EndMacro  
        Macro peekaCRC(MEM, CRC)
          CRC = Chr(PeekA(MEM+2024))+Chr(PeekA(MEM+2024+1))+Chr(PeekA(MEM+2024+2))+Chr(PeekA(MEM+2024+3))+Chr(PeekA(MEM+2024+4))+Chr(PeekA(MEM+2024+5))+Chr(PeekA(MEM+2024+6))+Chr(PeekA(MEM+2024+7))
        EndMacro  
        Macro peekqSZData(MEM, SZData)
          SZData = PeekQ(MEM+2032)
        EndMacro  
        Macro peekbDAType(MEM, DAType)
          DAType = PeekB(MEM+2040)
        EndMacro  
        
        Macro pokeaIData(MEM, IData)
          PokeA(MEM+0,Asc(Mid(IData,1,1))):PokeA(MEM+1,Asc(Mid(IData,2,1))):PokeA(MEM+2,Asc(Mid(IData,3,1))):PokeA(MEM+3,Asc(Mid(IData,4,1))):PokeA(MEM+4,Asc(Mid(IData,5,1))):PokeA(MEM+5,Asc(Mid(IData,6,1))):PokeA(MEM+6,Asc(Mid(IData,7,1))):PokeA(MEM+7,Asc(Mid(IData,8,1)))
        EndMacro  
        Macro pokeqSZchunk(MEM, SZchunk)
          PokeQ(MEM+8, SZchunk)
        EndMacro  
        Macro pokeqOFFset(MEM, OFFset)
          PokeQ(MEM+16, OFFset)
        EndMacro  
        Macro pokeaCRC(MEM, CRC)
          PokeA(MEM+2024+0,Asc(Mid(CRC,1,1))):PokeA(MEM+2024+1,Asc(Mid(CRC,2,1))):PokeA(MEM+2024+2,Asc(Mid(CRC,3,1))):PokeA(MEM+2024+3,Asc(Mid(CRC,4,1))):PokeA(MEM+2024+4,Asc(Mid(CRC,5,1))):PokeA(MEM+2024+5,Asc(Mid(CRC,6,1))):PokeA(MEM+2024+6,Asc(Mid(CRC,7,1))):PokeA(MEM+2024+7,Asc(Mid(CRC,8,1)))
        EndMacro  
        Macro pokeqSZData(MEM, SZData)
          PokeQ(MEM+2032, SZData)
        EndMacro  
        Macro pokebDAType(MEM, DAType)
          PokeB(MEM+2040, DAType)
        EndMacro  
        ;}  
      ;{ Inits    
        InitNetwork()
        UseMD5Fingerprint()
        UseCRC32Fingerprint()
      ;}
      ;{ Prox  
          Procedure INITsrv(*srv.srvDef)
            Protected srvMod
            If *Srv\srvPort > 0 And *Srv\srvPort < 65000
              ;{ InitSrv
              If *Srv\srvNETProto = #PB_Network_TCP Or *Srv\srvNETProto = #PB_Network_UDP
                If *Srv\srvTCPver = #PB_Network_IPv4 Or *Srv\srvTCPver = #PB_Network_IPv6
                  srvMod = *Srv\srvNETProto | *Srv\srvTCPver
                Else  
                  srvMod = *Srv\srvNETProto
                EndIf
              Else   
                srvMod = #PB_Network_TCP | #PB_Network_IPv4
              EndIf
              
              If *Srv\srvIPnterface = 0
                *Srv\srvCRet = CreateNetworkServer(#PB_Any, *Srv\srvPort,  srvMod)
              Else
                *Srv\srvCRet = CreateNetworkServer(#PB_Any, *Srv\srvPort,  srvMod, IPString(*Srv\srvIPnterface, *Srv\srvTCPver))
              EndIf
              ;}
              If *Srv\srvCRet;{
                ;{ InitVars
                Protected TotalBytes.q
                Protected clGUIDnit.b,
                          charMod.a, 
                          iData.s,
                          rawDAType.b,
                          szRAWdata.q,
                          crcRAWdata.s,
                          offseData.q,
                          szDataChunk.q,
                          cuRecvdBytes.u,
                          cuRecvdBytesClean.b
                          
                Protected *rawData.rawData = AllocateMemory(*srv\szBuff)
                FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                ;}
                ;{ StoreSrvDetails
                *Srv\srvID = ServerID(*Srv\srvCRet)
                *Srv\srvRUNstat = #True
                ;}
                ;{ InitVars
                Protected szInitBytes.a = 24,
                          szFinitBytes.a = 17,
                          szDataBytes.u = #DataBuff - szInitBytes - szFinitBytes
                ;}
                Repeat;{
                  SERVent = NetworkServerEvent()
                    Select SERVent
                      Case #PB_NetworkEvent_None
                      Case #PB_NetworkEvent_Connect;{
                        srvCRet  = EventServer() 
                        clCRet   = EventClient() 
                        ;{ MapAddConnDetails
                        If Not FindMapElement(*Srv\Clients(), Str(clCRet)) 
                          
                            srvAuthID = Random(99999999,10000000)
                            
                            Debug "srvAuthID: "+srvAuthID
                            
                            *Srv\Clients(Str(clCRet))\clCRet            = clCRet
                            *Srv\Clients(Str(clCRet))\clID              = ConnectionID(clCRet)
                            
                            *Srv\szClients                              = *Srv\szClients + 1
                            
                            *Srv\Clients(Str(clCRet))\clIP              = GetClientIP(clCRet)                            
                            *Srv\Clients(Str(clCRet))\clPort            = GetClientPort(clCRet)
                            
                        EndIf
                        ;}
                        ;}
                      Case #PB_NetworkEvent_Disconnect;{ 
                        srvCRet  = EventServer() 
                        clCRet   = EventClient() 
                        ;{ MapRemuvConnDetails
                        If FindMapElement(*Srv\Clients(), Str(clCRet)) 
                          
                            *Srv\szClients                              = *Srv\szClients - 1
                            
                            DeleteMapElement(*Srv\Clients() , Str(clCRet)) 
                          
                        EndIf  
                        ;}  
                        ;}
                      Case #PB_NetworkEvent_Data;{
                        cuRecvdBytesClean = #False
                        srvCRet  = EventServer() 
                        clCRet   = EventClient() 
                        If FindMapElement(*Srv\Clients(), Str(clCRet)) 
                          Repeat;{
                            cuRecvdBytes = 0
                            ;{ StartRecvBytes
                            cuRecvdBytes = ReceiveNetworkData(clCRet, *rawData, *srv\szBuff) 
                            If cuRecvdBytes = 10;{
                              ;{ Gather18Bytes
                              charMod = PeekA(*rawData)
                              cliAuthID = PeekQ(*rawData+1)
                              clGUIDnit = PeekB(*rawData+9)
                              ;}
                              If  charMod = #PB_Ascii Or charMod = #PB_Unicode Or charMod = #PB_UTF8;{
                                If clGUIDnit = #True And 
                                  *Srv\Clients(Str(clCRet))\charMod = charMod And 
                                  *Srv\Clients(Str(clCRet))\cliAuthID = cliAuthID
                                  ;{ clMAPStoreGUIDinitOK
                                  *Srv\Clients(Str(clCRet))\clGUIDnit = clGUIDnit
                                  ;}
                                  ;{ SendSRVGUIDone
                                  FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                  PokeB(*rawData, #rcvStat2)
                                  SendNetworkData(clCRet, *rawData, 1)
                                  FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                  ;}
                                Else  
                                  ;{ clMAPStoreDiAuthID
                                  *Srv\Clients(Str(clCRet))\charMod = charMod
                                  *Srv\Clients(Str(clCRet))\cliAuthID = cliAuthID
                                  *Srv\Clients(Str(clCRet))\srvAuthID = srvAuthID
                                  ;}
                                  ;{ Send17bSrvAuthID
                                  FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                  PokeB(*rawData, #rcvStat1)
                                  PokeQ(*rawData + 1, srvAuthID)
                                  SendNetworkData(clCRet, *rawData, 9)
                                  FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                  ;}
                                EndIf  
                              EndIf ;}
                            ;}  
                            ElseIf cuRecvdBytes = *srv\szBuff;{
                              Debug "EndBytes"
                              ;{ GatherFooterASheader
                              szRAWdata = *rawData\szData       :Debug "szRAWdata: "   + szRAWdata  ; + 2032);peekqSZData(*rawData, szRAWdata)
                              rawDAType = *rawData\rawDAType    :Debug "rawDAType: "   + rawDAType  ; + 2040);peekbDAType(*rawData, rawDAType);
                              peekaIData(*rawData, iData)       :Debug "iData: "       + iData      ;iData.s = Chr(*rawData\iData[0])+Chr(*rawData\iData[1])+Chr(*rawData\iData[2])+Chr(*rawData\iData[3])+Chr(*rawData\iData[4])+Chr(*rawData\iData[5])+Chr(*rawData\iData[6])+Chr(*rawData\iData[7]);
                              peekaCRC(*rawData, crcRAWdata)    :Debug "crcRAWdata: "  + crcRAWdata ;crcRAWdata = Chr(*rawData\crcData[0])+Chr(*rawData\crcData[1])+Chr(*rawData\crcData[2])+Chr(*rawData\crcData[3])+Chr(*rawData\crcData[4])+Chr(*rawData\crcData[5])+Chr(*rawData\crcData[6])+Chr(*rawData\crcData[7])
                              szDataChunk = *rawData\szDataChunk:Debug "szDataChunk: " + szDataChunk;peekqSZchunk(*rawData, szDataChunk);
                              offseData = *rawData\offseData    :Debug "offseData: "   + offseData  ;peekqOFFset(*rawData, offseData);
                              ;}
                              If szRAWdata > 0 And iData <> "" And szDataChunk > 0 And offseData > 0;{
                                TotalBytes + cuRecvdBytes
                                FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                
                                If szRAWdata >= szDataBytes
                                  PokeB(*rawData, #rcvStat3)
                                Else  
                                  PokeB(*rawData, #rcvStat4)
                                EndIf
                                
                                If SendNetworkData(clCRet, *rawData, 1);17)
                                  If szRAWdata > szDataBytes
                                    Debug "footerBytesRecvDone, step to remainingVytes"
                                  Else
                                    Debug "AllBytesRecvDone"
                                  EndIf
                                EndIf  
                                
                                FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                
                              EndIf ;} 
                            ;}  
                            ElseIf cuRecvdBytes > 24 And cuRecvdBytes < *srv\szBuff;{
                              ;{ GatherMidBytesDetails
                              peekaIData(*rawData, iData)       :Debug "iData: "       + iData                                      ;iData.s = Chr(*rawData\iData[0])+Chr(*rawData\iData[1])+Chr(*rawData\iData[2])+Chr(*rawData\iData[3])+Chr(*rawData\iData[4])+Chr(*rawData\iData[5])+Chr(*rawData\iData[6])+Chr(*rawData\iData[7])
                              szDataChunk = *rawData\szDataChunk:Debug "szDataChunk: " + szDataChunk                                      ;peekqSZchunk(*rawData, szDataChunk);
                              offseData = *rawData\offseData    :Debug "offseData: "   + offseData                                          ;peekqOFFset(*rawData, offseData);
                              ;}
                              If iData <> "" And szDataChunk > 0 And szRAWdata > 0 ;{
                                If offseData > 0
                                  TotalBytes + cuRecvdBytes
                                  FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                  PokeB(*rawData, #rcvStat3)
                                  If SendNetworkData(clCRet, *rawData, 1);17)
                                      Debug "Send_midBytesPortionRecvDone: "+Str(szDataChunk)+"@"+Str(offseData)
                                  EndIf  
                                  FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                Else
                                  FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                  PokeB(*rawData, #rcvStat4)
                                  If SendNetworkData(clCRet, *rawData, 1);17)
                                      Debug "AllSend_midBytesPortionRecvDone: "+Str(szDataChunk)+"@"+Str(offseData)
                                  EndIf  
                                  FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                EndIf  
                              EndIf ;} 
                            ;}  
                            EndIf
                            FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                          ;}  
                          Until cuRecvdBytes <= 0;} ; quit if bank is empty
                          FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                        EndIf
                        ;}
                    EndSelect
                    Delay(10)                    
                Until *Srv\srvCRet And *Srv\srvMAYdown = #True;}
                ;{ CleanUp
                FreeMemory(*rawData)
                
                ForEach *Srv\Clients()
                  DeleteMapElement(*Srv\Clients())
                Next  
                
                FreeMap(*Srv\Clients())
                ;}
              EndIf;}
              *Srv\srvRUNstat = #False
              ProcedureReturn #True
            EndIf  
            ProcedureReturn #False
          EndProcedure
      ;}    
          
          Define srv.srvDef
          srv\szBuff        = #DataBuff
          srv\srvPort       = 56789
          srv\srvNETProto   = #PB_Network_TCP      
          srv\srvTCPver     = #PB_Network_IPv4    
          srv\srvIPnterface = 16777343
          INITsrv(@srv)
          
ClientPart:

Code: Select all

      ;{ Consts
        #DataBuff         = 2041
        
        Enumeration ;rawDAType
          #rawDAType_txtMSG  
          #rawDAType_audMSG  
          #rawDAType_photoMSG
          #rawDAType_vidMSG  
        EndEnumeration  
        
        Enumeration ;rcvStat
          #rcvStat1 = 1
          #rcvStat2 = 2
          #rcvStat3 = 3
          #rcvStat4 = 4
          #rcvStat5 = 5
          #rcvStat6 = 6
          #rcvStat7 = 7
        EndEnumeration  
      ;}
      ;{ Structs
          Structure rawData       
            iData.a[8]            
            szDataChunk.q         
            offseData.q          
            memData.a[2000]      
            crcData.a[8]         
            szData.q             
            rawDAType.b          
          EndStructure
          
          Structure clIDef        
            srvAuthID.q  
            cliAuthID.q      
            clCRet.i              
            clID.i                
            clIP.l                
            clPort.u            
            clGUIDnit.b         
            charMod.a             
          EndStructure  
          
          Structure srvDef         
            szBuff.u               
            srvCRet.i              
            srvID.i                
            srvPort.u              
            srvNETProto.l          
            srvTCPver.l            
            srvIPnterface.l        
            srvRUNstat.b           
            srvMAYdown.b           
            srvTERMsignal.b        
            szClients.l            
            hMemQLite.i 
            Map Clients.clIDef()   
          EndStructure            
      ;}
      ;{ Macros
        Macro peekaIData(MEM, IData)
          IData = Chr(PeekA(MEM))+Chr(PeekA(MEM+1))+Chr(PeekA(MEM+2))+Chr(PeekA(MEM+3))+Chr(PeekA(MEM+4))+Chr(PeekA(MEM+5))+Chr(PeekA(MEM+6))+Chr(PeekA(MEM+7))
        EndMacro  
        Macro peekqSZchunk(MEM, SZchunk)
          SZchunk = PeekQ(MEM+8)
        EndMacro  
        Macro peekqOFFset(MEM, OFFset)
          OFFset = PeekQ(MEM+16)
        EndMacro  
        Macro peekaCRC(MEM, CRC)
          CRC = Chr(PeekA(MEM+2024))+Chr(PeekA(MEM+2024+1))+Chr(PeekA(MEM+2024+2))+Chr(PeekA(MEM+2024+3))+Chr(PeekA(MEM+2024+4))+Chr(PeekA(MEM+2024+5))+Chr(PeekA(MEM+2024+6))+Chr(PeekA(MEM+2024+7))
        EndMacro  
        Macro peekqSZData(MEM, SZData)
          SZData = PeekQ(MEM+2032)
        EndMacro  
        Macro peekbDAType(MEM, DAType)
          DAType = PeekB(MEM+2040)
        EndMacro  
        
        Macro pokeaIData(MEM, IData)
          PokeA(MEM+0,Asc(Mid(IData,1,1))):PokeA(MEM+1,Asc(Mid(IData,2,1))):PokeA(MEM+2,Asc(Mid(IData,3,1))):PokeA(MEM+3,Asc(Mid(IData,4,1))):PokeA(MEM+4,Asc(Mid(IData,5,1))):PokeA(MEM+5,Asc(Mid(IData,6,1))):PokeA(MEM+6,Asc(Mid(IData,7,1))):PokeA(MEM+7,Asc(Mid(IData,8,1)))
        EndMacro  
        Macro pokeqSZchunk(MEM, SZchunk)
          PokeQ(MEM+8, SZchunk)
        EndMacro  
        Macro pokeqOFFset(MEM, OFFset)
          PokeQ(MEM+16, OFFset)
        EndMacro  
        Macro pokeaCRC(MEM, CRC)
          PokeA(MEM+2024+0,Asc(Mid(CRC,1,1))):PokeA(MEM+2024+1,Asc(Mid(CRC,2,1))):PokeA(MEM+2024+2,Asc(Mid(CRC,3,1))):PokeA(MEM+2024+3,Asc(Mid(CRC,4,1))):PokeA(MEM+2024+4,Asc(Mid(CRC,5,1))):PokeA(MEM+2024+5,Asc(Mid(CRC,6,1))):PokeA(MEM+2024+6,Asc(Mid(CRC,7,1))):PokeA(MEM+2024+7,Asc(Mid(CRC,8,1)))
        EndMacro  
        Macro pokeqSZData(MEM, SZData)
          PokeQ(MEM+2032, SZData)
        EndMacro  
        Macro pokebDAType(MEM, DAType)
          PokeB(MEM+2040, DAType)
        EndMacro  
        ;}  
      ;{ Inits    
        InitNetwork()
        UseMD5Fingerprint()
        UseCRC32Fingerprint()
      ;}

          Procedure CliMain(*SenData, szSenData.q, RawDAType.b, iData.s, ipSrv.s, portSrv.u, typeCon.l, charMod = #PB_UTF8)
            ;{ InitVars
            Protected szInitBytes.a = 24,
                      szFinitBytes.a = 17,
                      szDataBytes.u = #DataBuff - szInitBytes - szFinitBytes,
                      szSenDone.q, szDataChunk.q, offseData.q, szData.q
            ;}
            If szSenData > 0 And Len(iData) = 8
              ;{ InitCon
              Con = OpenNetworkConnection(ipSrv, portSrv, typeCon)
              ;}
              If Con
                ;{ iNetVars
                Protected rcvStat.b
                Protected *rawData.rawData = AllocateMemory(#DataBuff)
                FillMemory(*rawData, #DataBuff, 0, #PB_Byte)
                
                Protected cliAuthID.q,
                          srvAuthID.q
                ;}
                ;{ CreateInitSenData
                cliAuthID = Random(99999999,10000000)
                PokeB(*rawData, charMod)
                PokeQ(*rawData+1, cliAuthID)
                PokeB(*rawData+9, #False)
                ;}
                If SendNetworkData(Con, *rawData, 10)
                  FillMemory(*rawData, #DataBuff, 0, #PB_Byte)          ; CleanUp
                  Repeat
                    Select NetworkClientEvent(Con)                      ; WaitSignal
                      Case #PB_NetworkEvent_Data
                        Len = ReceiveNetworkData(Con, *rawData, MemorySize(*rawData))
                        If Len = 9                                     ; RecvSrvGUIData
                          ;{ RcvSrvGUIData
                          rcvStat = PeekB(*rawData)
                          srvAuthID = PeekQ(*rawData + 1)
                          
                          Debug "srvAuthID: "+srvAuthID
                          If rcvStat = #rcvStat1
                            Debug "reTrySend10Bytes"
                            FillMemory(*rawData, #DataBuff, 0, #PB_Byte)   ; CleanUp
                          ;}
                          ;{ RECreateSendTrueInitSenData
                            PokeB(*rawData, charMod)
                            PokeQ(*rawData+1, cliAuthID)
                            PokeB(*rawData+9, #True)
                            SendNetworkData(Con, *rawData, 10)
                            FillMemory(*rawData, #DataBuff, 0, #PB_Byte)   ; CleanUp
                          EndIf
                          ;}
                        ElseIf Len = 1
                          rcvStat = PeekB(*rawData)
                          szData = szSenData
                          Debug rcvStat
                          If rcvStat = #rcvStat2                      ; sENData
                            ;{ CreaStaticDetails
                            *rawData\szData = szData;pokeqSZData(*rawData, szSenData)
                            *rawData\rawDAType = RawDAType;pokebDAType(*rawData, RawDAType);*rawData\rawDAType = RawDAType; + 2040)
                            PokeS(*rawData, iData, 8, charMod | #PB_String_NoZero)
                            PokeS(*rawData + szInitBytes + szDataBytes, Fingerprint(*SenData, szSenData, #PB_Cipher_CRC32, #PB_Cipher_SHA2), 8, charMod | #PB_String_NoZero)
                            ;}
                            ;{ CreaDynamicDetails
                            If Mod(szData, szDataBytes) = 0
                              szDataChunk = szDataBytes;*rawData\szDataChunk = szDataBytes
                            Else
                              szDataChunk = Mod(szData, szDataBytes);*rawData\szDataChunk = Mod(szSenData, szDataBytes)
                            EndIf
                            offseData = szData - szDataChunk
                            *rawData\szDataChunk = szDataChunk;pokeqSZchunk(*rawData, szDataChunk)
                            *rawData\offseData = offseData;pokeqOFFset(*rawData, offseData);*rawData\offseData = szSenData - *rawData\szDataChunk
                            ;}
                            ;{ sENData
                            CopyMemory(*SenData + offseData, *rawData + szInitBytes, szDataChunk)
                            If SendNetworkData(Con, *rawData, #DataBuff)
                              szSenDone + szDataChunk
                            EndIf  
                            FillMemory(*rawData, #DataBuff, 0, #PB_Byte)          ; CleanUp
                            ;}
                          ElseIf rcvStat = #rcvStat3              ; SendUpToEndBytes
                            If offseData > 0;szData > szDataBytes
                              ;{ CreaDynamicDetails
                              PokeS(*rawData, iData, 8, charMod | #PB_String_NoZero)
                              szDataChunk = szDataBytes
                              *rawData\szDataChunk = szDataChunk;pokeqSZchunk(*rawData, szDataBytes)
                              offseData - szDataChunk
                              
                              *rawData\offseData = offseData;pokeqOFFset(*rawData, offseData)
                              ;}
                              ;{ SenData
                              CopyMemory(*SenData + offseData, *rawData + szInitBytes, szDataChunk)
                              If SendNetworkData(Con, *rawData, szInitBytes + szDataBytes)
                                szSenDone + szDataChunk
                              EndIf
                              FillMemory(*rawData, #DataBuff, 0, #PB_Byte)          ; CleanUp
                              ;}
                            Else  
                              CloseNetworkConnection(Con)
                              Break
                            EndIf
                          ElseIf rcvStat = #rcvStat4
                            CloseNetworkConnection(Con)
                            Break
                          Else  
                            
                          EndIf  
                            
                        EndIf
                        
                        Len = -1
                        
                      Case #PB_NetworkEvent_None
                    EndSelect
                    Delay(10)
                  ForEver
                 
                EndIf
                
                FreeMemory(*rawData)
               
              EndIf
              
            EndIf  
              
          EndProcedure
          
          hFile = OpenFile(#PB_Any, "c:\temp\1.zip")
          If hFile
            szFile = Lof(hFile)
            *memFile = AllocateMemory(szFile)
              ReadData(hFile, *memFile, szFile)
              CloseFile(hFile)
              CliMain(*memFile, szFile, #rawDAType_txtMSG, "A1b2C3d4", "127.0.0.1", 56789, #PB_Network_TCP|#PB_Network_IPv4, #PB_Ascii)
              FreeMemory(*memFile)
          EndIf
          
Thanks in advance.
Last edited by LiK137 on Sat Nov 07, 2020 7:21 am, edited 1 time in total.
User avatar
Mijikai
Addict
Addict
Posts: 1360
Joined: Sun Sep 11, 2016 2:17 pm

Re: Client Server Send Data randomly corruption

Post by Mijikai »

Why do u use all the peek/poke's?
Its too confusing for me.

Anyway... have u tried EnableExplicit?
Olli
Addict
Addict
Posts: 1071
Joined: Wed May 27, 2020 12:26 pm

Re: Client Server Send Data randomly corruption

Post by Olli »

Hello Lik137,


happy to see you. I would wish to tell you a remark.

When you build a string from memory, a problem can occur, due to the null terminal convention.

Example

Code: Select all

a$= Chr(65)+ Chr(0)+ Chr(66)
debug a$ ; will display 'A' only
Here we have 'A', 0, 'B' but 0 stops the string, and 'B' (= Chr(66) ) is ignored.

If your CRC is getting a memory quad which contains a null byte, your CRC result will be wrong.

Maybe, a first step should be a converting operation like this :

Code: Select all

x$= Right("000000000000000"+ Hex(PeekQ(crcAddress) ), 16)
which returns a code as this following example : 8B4AC56743AA00B7.


Regards
LiK137
Enthusiast
Enthusiast
Posts: 282
Joined: Wed Jun 23, 2010 5:13 pm

Re: Client Server Send Data randomly corruption

Post by LiK137 »

Dear Olli, dear Mijikai,
thanks very much for reply.
Mijikai, I use structured memory allocation, intend to use getting data as structured memory.
Instead of peek or poke just using structure\element.
But some moments make use of peek or poke mandatory like passing signals out of structure like CharMod, AuthID and InitStat.

Regarding my dear Olli's reply, in the structured memory being passed there is mainly chunksize, offsed and asciidata used.
CRC and AuthID are used as string but in fact AuthID is 16 byte GUID (I changed for readability of the example).

If we copy & paste the codes (both Client and Server) the if we first run server and with a little delay (2-3 seconds) run client then in 2 or 3 of 10 runs our code will reach the correct end but if we run server and client with almost no delay the it will run inappropriate all 10 of 10 runs.

What I think and assume is that the memory allocated in server part is overwritten, buffer overflow occurs.

Even one normal run as intended and source itself IMHO shows no memory leak bur something goes wrong and I do not catch it and need your help and advice.

Many thanks.
User avatar
Mijikai
Addict
Addict
Posts: 1360
Joined: Sun Sep 11, 2016 2:17 pm

Re: Client Server Send Data randomly corruption

Post by Mijikai »

U could use StructureUnion :)

Code: Select all

Structure rawDataAccess
  StructureUnion
    charMod.a
    rcvStat.b
  EndStructureUnion
  StructureUnion
    srvAuthID.q
    cliAuthID.q
  EndStructureUnion
  clGUIDnit.b
EndStructure

Protected *rawDataAccess.rawDataAccess = *rawData

;reading
Debug *rawDataAccess\charMod
Debug *rawDataAccess\cliAuthID
Debug *rawDataAccess\clGUIDnit

;writing
*rawDataAccess\rcvStat = #rcvStat1
*rawDataAccess\srvAuthID = srvAuthID
LiK137
Enthusiast
Enthusiast
Posts: 282
Joined: Wed Jun 23, 2010 5:13 pm

Re: Client Server Send Data randomly corruption

Post by LiK137 »

Hi Mijikai,
Your reply is regarding structure but what about memory corruption?
When memory corruption occurs there is a very big quad number overwritten in quad chunksize and offcet.
Then I compare chunksize and offset which could not be greater than buffermaxsize and sentdatamaxsize, and call showmemoryviewer of *rawdata and see memory inaccessible.
Then In case chunksize and offset greater than normal size I continue code by sending signal to client for next portion of data.
So what I want to say, randomly in the middle of the code, the *rawdata address becomes inaccessible or somehow overwritten.
I'm about exclusively the code I posted here and If the code doesn't have problems then this seems to be a bug IMHO.
cas
Enthusiast
Enthusiast
Posts: 597
Joined: Mon Nov 03, 2008 9:56 pm

Re: Client Server Send Data randomly corruption

Post by cas »

First thing i can say after looking at this code is that you do not understand how Send/ReceiveNetworkData() works and that is a big problem when you try to code network apps.

Code: Select all

Repeat
  SERVent = NetworkServerEvent()
  Select SERVent
    Case #PB_NetworkEvent_Data
      Repeat
        cuRecvdBytes = ReceiveNetworkData(clCRet, *rawData, *srv\szBuff)
        If cuRecvdBytes = 10
          ;...
        ElseIf cuRecvdBytes = *srv\szBuff
          ;...
        ElseIf cuRecvdBytes > 24 And cuRecvdBytes < *srv\szBuff
          ;...
        EndIf
On Windows OS, ReceiveNetworkData() can return 0 or SOCKET_ERROR (and you must handle WSAEWOULDBLOCK) or anything from 1 to DataBufferLength (3rd param to ReceiveNetworkData()). For more info check https://docs.microsoft.com/en-us/window ... nsock-recv (ReceiveNetworkData() is a wrapper for recv_()). And, you can not call ReceiveNetworkData() inside a loop inside a Case #PB_NetworkEvent_Data because after each return from ReceiveNetworkData() you must go back to call NetworkServerEvent(). Add a debug line after ReceiveNetworkData() ("Debug cuRecvdBytes") to check what it returns, you will see that it repeatedly returns 65535 (0xFFFF) and that could have given you a hint that you are doing something wrong here because you are also wasting cpu cycles.

Code: Select all

SendNetworkData(clCRet, *rawData, 9)
For SendNetworkData() you must also check return value (read https://www.purebasic.com/documentation ... kdata.html). This function is a wrapper for send_() so check that also: https://docs.microsoft.com/en-us/window ... sock2-send

When you learn how networking works, and since your app has variable sized network packets, you will realize that you need to add a header to each network packet that will indicate packet length. My advice to you: first try to write a simple network client-server chat app and then when you will have that going smoothly then return to this project (and preferably start from scratch).
LiK137
Enthusiast
Enthusiast
Posts: 282
Joined: Wed Jun 23, 2010 5:13 pm

Re: Client Server Send Data randomly corruption

Post by LiK137 »

Hi cas,
many thanks for commenting my faulty code. Confess, very big mistake I've done by receiving until received data size is zero which never happens as You mentioned always 65K.
By the way, I added delay and now it runs without fail but both we know the code is faulty and should be modified in Your way.
Let me modify, check and reply.
Many thanks to everyone for valuable help.
LiK137
Enthusiast
Enthusiast
Posts: 282
Joined: Wed Jun 23, 2010 5:13 pm

Re: Client Server Send Data randomly corruption

Post by LiK137 »

Hi cas,
the case solved and good lesson regarding Client/Server arch.
Posting working code and will be very glad for other useful comments.
Srv:

Code: Select all

EnableExplicit
      ;{ Consts
        #DataBuff         = 2041
        
        Enumeration ;rawDAType
          #rawDAType_txtMSG  
          #rawDAType_audMSG  
          #rawDAType_photoMSG
          #rawDAType_vidMSG  
        EndEnumeration  
        
        Enumeration ;rcvStat
          #rcvStat1 = 1
          #rcvStat2 = 2
          #rcvStat3 = 3
          #rcvStat4 = 4
          #rcvStat5 = 5
          #rcvStat6 = 6
          #rcvStat7 = 7
        EndEnumeration  
      ;}
      ;{ Structs
          Structure rawData       
            iData.a[8]            
            szDataChunk.q         
            offseData.q          
            memData.a[2000]      
            crcData.a[8]         
            szData.q             
            rawDAType.b          
          EndStructure
          
          Structure clIDef        
            srvAuthID.q  
            cliAuthID.q      
            clCRet.i              
            clID.i                
            clIP.l                
            clPort.u            
            clGUIDnit.b         
            charMod.a             
          EndStructure  
          
          Structure srvDef         
            szBuff.u               
            srvCRet.i              
            srvID.i                
            srvPort.u              
            srvNETProto.l          
            srvTCPver.l            
            srvIPnterface.l        
            srvRUNstat.b           
            srvMAYdown.b           
            srvTERMsignal.b        
            szClients.l            
            hMemQLite.i 
            Map Clients.clIDef()   
          EndStructure            
      ;}
      ;{ Macros
        Macro peekaIData(MEM, IData)
          IData = Chr(PeekA(MEM))+Chr(PeekA(MEM+1))+Chr(PeekA(MEM+2))+Chr(PeekA(MEM+3))+Chr(PeekA(MEM+4))+Chr(PeekA(MEM+5))+Chr(PeekA(MEM+6))+Chr(PeekA(MEM+7))
        EndMacro  
        Macro peekqSZchunk(MEM, SZchunk)
          SZchunk = PeekQ(MEM+8)
        EndMacro  
        Macro peekqOFFset(MEM, OFFset)
          OFFset = PeekQ(MEM+16)
        EndMacro  
        Macro peekaCRC(MEM, CRC)
          CRC = Chr(PeekA(MEM+2024))+Chr(PeekA(MEM+2024+1))+Chr(PeekA(MEM+2024+2))+Chr(PeekA(MEM+2024+3))+Chr(PeekA(MEM+2024+4))+Chr(PeekA(MEM+2024+5))+Chr(PeekA(MEM+2024+6))+Chr(PeekA(MEM+2024+7))
        EndMacro  
        Macro peekqSZData(MEM, SZData)
          SZData = PeekQ(MEM+2032)
        EndMacro  
        Macro peekbDAType(MEM, DAType)
          DAType = PeekB(MEM+2040)
        EndMacro  
        
        Macro pokeaIData(MEM, IData)
          PokeA(MEM+0,Asc(Mid(IData,1,1))):PokeA(MEM+1,Asc(Mid(IData,2,1))):PokeA(MEM+2,Asc(Mid(IData,3,1))):PokeA(MEM+3,Asc(Mid(IData,4,1))):PokeA(MEM+4,Asc(Mid(IData,5,1))):PokeA(MEM+5,Asc(Mid(IData,6,1))):PokeA(MEM+6,Asc(Mid(IData,7,1))):PokeA(MEM+7,Asc(Mid(IData,8,1)))
        EndMacro  
        Macro pokeqSZchunk(MEM, SZchunk)
          PokeQ(MEM+8, SZchunk)
        EndMacro  
        Macro pokeqOFFset(MEM, OFFset)
          PokeQ(MEM+16, OFFset)
        EndMacro  
        Macro pokeaCRC(MEM, CRC)
          PokeA(MEM+2024+0,Asc(Mid(CRC,1,1))):PokeA(MEM+2024+1,Asc(Mid(CRC,2,1))):PokeA(MEM+2024+2,Asc(Mid(CRC,3,1))):PokeA(MEM+2024+3,Asc(Mid(CRC,4,1))):PokeA(MEM+2024+4,Asc(Mid(CRC,5,1))):PokeA(MEM+2024+5,Asc(Mid(CRC,6,1))):PokeA(MEM+2024+6,Asc(Mid(CRC,7,1))):PokeA(MEM+2024+7,Asc(Mid(CRC,8,1)))
        EndMacro  
        Macro pokeqSZData(MEM, SZData)
          PokeQ(MEM+2032, SZData)
        EndMacro  
        Macro pokebDAType(MEM, DAType)
          PokeB(MEM+2040, DAType)
        EndMacro  
        ;}  
      ;{ Inits    
        InitNetwork()
        UseMD5Fingerprint()
        UseCRC32Fingerprint()
      ;}
      ;{ Prox  
          Procedure INITsrv(*srv.srvDef)
            Protected srvMod, SERVent, srvCRet, clCRet, srvAuthID, cliAuthID
            If *Srv\srvPort > 0 And *Srv\srvPort < 65000
              ;{ InitSrv
              If *Srv\srvNETProto = #PB_Network_TCP Or *Srv\srvNETProto = #PB_Network_UDP
                If *Srv\srvTCPver = #PB_Network_IPv4 Or *Srv\srvTCPver = #PB_Network_IPv6
                  srvMod = *Srv\srvNETProto | *Srv\srvTCPver
                Else  
                  srvMod = *Srv\srvNETProto
                EndIf
              Else   
                srvMod = #PB_Network_TCP | #PB_Network_IPv4
              EndIf
              
              If *Srv\srvIPnterface = 0
                *Srv\srvCRet = CreateNetworkServer(#PB_Any, *Srv\srvPort,  srvMod)
              Else
                *Srv\srvCRet = CreateNetworkServer(#PB_Any, *Srv\srvPort,  srvMod, IPString(*Srv\srvIPnterface, *Srv\srvTCPver))
              EndIf
              ;}
              If *Srv\srvCRet;{
                ;{ InitVars
                Protected TotalBytes.q
                Protected clGUIDnit.b,
                          charMod.a, 
                          iData.s,
                          rawDAType.b,
                          szRAWdata.q,
                          crcRAWdata.s,
                          offseData.q,
                          szDataChunk.q,
                          cuRecvdBytes.u,
                          cuRecvdBytesClean.b
                          
                Protected *rawData.rawData = AllocateMemory(*srv\szBuff)
                FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                ;}
                ;{ StoreSrvDetails
                *Srv\srvID = ServerID(*Srv\srvCRet)
                *Srv\srvRUNstat = #True
                ;}
                ;{ InitVars
                Protected szInitBytes.a = 24,
                          szFinitBytes.a = 17,
                          szDataBytes.u = #DataBuff - szInitBytes - szFinitBytes
                ;}
                Repeat;{
                  SERVent = NetworkServerEvent()
                    Select SERVent
                      Case #PB_NetworkEvent_None
                      Case #PB_NetworkEvent_Connect;{
                        srvCRet  = EventServer() 
                        clCRet   = EventClient() 
                        ;{ MapAddConnDetails
                        If Not FindMapElement(*Srv\Clients(), Str(clCRet)) 
                          
                            srvAuthID = Random(99999999,10000000)
                            
                            Debug "srvAuthID: "+srvAuthID
                            
                            *Srv\Clients(Str(clCRet))\clCRet            = clCRet
                            *Srv\Clients(Str(clCRet))\clID              = ConnectionID(clCRet)
                            
                            *Srv\szClients                              = *Srv\szClients + 1
                            
                            *Srv\Clients(Str(clCRet))\clIP              = GetClientIP(clCRet)                            
                            *Srv\Clients(Str(clCRet))\clPort            = GetClientPort(clCRet)
                            
                        EndIf
                        ;}
                        ;}
                      Case #PB_NetworkEvent_Disconnect;{ 
                        srvCRet  = EventServer() 
                        clCRet   = EventClient() 
                        ;{ MapRemuvConnDetails
                        If FindMapElement(*Srv\Clients(), Str(clCRet)) 
                          
                            *Srv\szClients                              = *Srv\szClients - 1
                            
                            DeleteMapElement(*Srv\Clients() , Str(clCRet)) 
                          
                        EndIf  
                        ;}  
                        ;}
                      Case #PB_NetworkEvent_Data;{
                        cuRecvdBytesClean = #False
                        srvCRet  = EventServer() 
                        clCRet   = EventClient() 
                        If FindMapElement(*Srv\Clients(), Str(clCRet));{
                            cuRecvdBytes = 0
                            cuRecvdBytes = ReceiveNetworkData(clCRet, *rawData, *srv\szBuff) 
                            If cuRecvdBytes = 10;{
                              Debug *rawData
                              ;{ Gather18Bytes
                              charMod = PeekA(*rawData)
                              cliAuthID = PeekQ(*rawData+1)
                              clGUIDnit = PeekB(*rawData+9)
                              ;}
                              If  charMod = #PB_Ascii Or charMod = #PB_Unicode Or charMod = #PB_UTF8;{
                                If clGUIDnit = #True And 
                                  *Srv\Clients(Str(clCRet))\charMod = charMod And 
                                  *Srv\Clients(Str(clCRet))\cliAuthID = cliAuthID
                                  ;{ clMAPStoreGUIDinitOK
                                  *Srv\Clients(Str(clCRet))\clGUIDnit = clGUIDnit
                                  ;}
                                  ;{ SendSRVGUIDone
                                  FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                  PokeA(*rawData, #rcvStat2)
                                  SendNetworkData(clCRet, *rawData, 1)
                                  FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                  ;}
                                Else  
                                  ;{ clMAPStoreDiAuthID
                                  *Srv\Clients(Str(clCRet))\charMod = charMod
                                  *Srv\Clients(Str(clCRet))\cliAuthID = cliAuthID
                                  *Srv\Clients(Str(clCRet))\srvAuthID = srvAuthID
                                  ;}
                                  ;{ Send17bSrvAuthID
                                  FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                  PokeA(*rawData, #rcvStat1)
                                  PokeQ(*rawData + 1, srvAuthID)
                                  SendNetworkData(clCRet, *rawData, 9)
                                  FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                  ;}
                                EndIf  
                              EndIf ;}
                            ;}  
                            ElseIf cuRecvdBytes = *srv\szBuff;{
                              Debug *rawData
                              ;{ GatherFooterASheader
                              szRAWdata = *rawData\szData       ;:Debug "szRAWdata: "   + szRAWdata  ; + 2032);peekqSZData(*rawData, szRAWdata)
                              rawDAType = *rawData\rawDAType    ;:Debug "rawDAType: "   + rawDAType  ; + 2040);peekbDAType(*rawData, rawDAType);
                              peekaIData(*rawData, iData)       ;:Debug "iData: "       + iData      ;iData.s = Chr(*rawData\iData[0])+Chr(*rawData\iData[1])+Chr(*rawData\iData[2])+Chr(*rawData\iData[3])+Chr(*rawData\iData[4])+Chr(*rawData\iData[5])+Chr(*rawData\iData[6])+Chr(*rawData\iData[7]);
                              peekaCRC(*rawData, crcRAWdata)    ;:Debug "crcRAWdata: "  + crcRAWdata ;crcRAWdata = Chr(*rawData\crcData[0])+Chr(*rawData\crcData[1])+Chr(*rawData\crcData[2])+Chr(*rawData\crcData[3])+Chr(*rawData\crcData[4])+Chr(*rawData\crcData[5])+Chr(*rawData\crcData[6])+Chr(*rawData\crcData[7])
                              szDataChunk = *rawData\szDataChunk;:Debug "szDataChunk: " + szDataChunk;peekqSZchunk(*rawData, szDataChunk);
                              offseData = *rawData\offseData    ;:Debug "offseData: "   + offseData  ;peekqOFFset(*rawData, offseData);
                              ;}
                              If szRAWdata > 0 And iData <> "" And szDataChunk > 0 And offseData > 0;{
                                TotalBytes + cuRecvdBytes
                                FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                
                                If szRAWdata >= szDataBytes
                                  PokeA(*rawData, #rcvStat3)
                                Else  
                                  PokeA(*rawData, #rcvStat4)
                                EndIf
                                
                                If SendNetworkData(clCRet, *rawData, 1);17)
                                  If szRAWdata > szDataBytes
                                    Debug "footerBytesRecvDone, step to remainingVytes"
                                  Else
                                    Debug "AllBytesRecvDone"
                                  EndIf
                                EndIf  
                                
                                FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                
                              EndIf ;} 
                            ;}  
                            ElseIf cuRecvdBytes > 24 And cuRecvdBytes < *srv\szBuff;{
                              Debug *rawData
                              
                              ;{ GatherMidBytesDetails
                              peekaIData(*rawData, iData)       ;:Debug "iData: "       + iData                                      ;iData.s = Chr(*rawData\iData[0])+Chr(*rawData\iData[1])+Chr(*rawData\iData[2])+Chr(*rawData\iData[3])+Chr(*rawData\iData[4])+Chr(*rawData\iData[5])+Chr(*rawData\iData[6])+Chr(*rawData\iData[7])
                              szDataChunk = *rawData\szDataChunk;:Debug "szDataChunk: " + szDataChunk                                      ;peekqSZchunk(*rawData, szDataChunk);
                              offseData = *rawData\offseData    ;:Debug "offseData: "   + offseData                                          ;peekqOFFset(*rawData, offseData);
                              ;}
                              If szDataChunk > szRAWdata
                                Debug "Send_midBytesPortionRecvDone: "+Str(szDataChunk)+"@"+Str(offseData)
                                FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                Debug "fillmem"
                                PokeA(*rawData, #rcvStat5)
                                Debug "pokea"
                                If SendNetworkData(clCRet, *rawData, 1);17)
                                  Debug "send"
                                  ;Debug "Send_midBytesPortionRecvDone: "+Str(szDataChunk)+"@"+Str(offseData)
                                EndIf  
                                FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                Debug "FillMem"
                                
                              ElseIf  iData <> "" And szDataChunk > 0 And szRAWdata > 0 ;{
                                If offseData > 0
                                  TotalBytes + cuRecvdBytes
                                  FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                  PokeA(*rawData, #rcvStat3)
                                  If SendNetworkData(clCRet, *rawData, 1);17)
                                      ;Debug "Send_midBytesPortionRecvDone: "+Str(szDataChunk)+"@"+Str(offseData)
                                  EndIf  
                                  FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                Else
                                  FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                  PokeA(*rawData, #rcvStat4)
                                  If SendNetworkData(clCRet, *rawData, 1);17)
                                      ;Debug "AllSend_midBytesPortionRecvDone: "+Str(szDataChunk)+"@"+Str(offseData)
                                  EndIf  
                                  FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                                EndIf  
                              EndIf ;} 
                            EndIf
                            FillMemory(*rawData, *srv\szBuff, 0, #PB_Byte)
                          ;}  
                        EndIf
                        ;}
                    EndSelect
                    Delay(1)                    
                Until *Srv\srvCRet And *Srv\srvMAYdown = #True;}
                ;{ CleanUp
                FreeMemory(*rawData)
                
                ForEach *Srv\Clients()
                  DeleteMapElement(*Srv\Clients())
                Next  
                
                FreeMap(*Srv\Clients())
                ;}
              EndIf;}
              *Srv\srvRUNstat = #False
              ProcedureReturn #True
            EndIf  
            ProcedureReturn #False
          EndProcedure
      ;}    
          
          Define srv.srvDef
          srv\szBuff        = #DataBuff
          srv\srvPort       = 56789
          srv\srvNETProto   = #PB_Network_TCP      
          srv\srvTCPver     = #PB_Network_IPv4    
          srv\srvIPnterface = 16777343
          INITsrv(@srv)
Cli:

Code: Select all

EnableExplicit
      ;{ Consts
        #DataBuff         = 2041
        
        Enumeration ;rawDAType
          #rawDAType_txtMSG  
          #rawDAType_audMSG  
          #rawDAType_photoMSG
          #rawDAType_vidMSG  
        EndEnumeration  
        
        Enumeration ;rcvStat
          #rcvStat1 = 1
          #rcvStat2 = 2
          #rcvStat3 = 3
          #rcvStat4 = 4
          #rcvStat5 = 5
          #rcvStat6 = 6
          #rcvStat7 = 7
        EndEnumeration  
      ;}
      ;{ Structs
          Structure rawData       
            iData.a[8]            
            szDataChunk.q         
            offseData.q          
            memData.a[2000]      
            crcData.a[8]         
            szData.q             
            rawDAType.b          
          EndStructure
          
          Structure clIDef        
            srvAuthID.q  
            cliAuthID.q      
            clCRet.i              
            clID.i                
            clIP.l                
            clPort.u            
            clGUIDnit.b         
            charMod.a             
          EndStructure  
          
          Structure srvDef         
            szBuff.u               
            srvCRet.i              
            srvID.i                
            srvPort.u              
            srvNETProto.l          
            srvTCPver.l            
            srvIPnterface.l        
            srvRUNstat.b           
            srvMAYdown.b           
            srvTERMsignal.b        
            szClients.l            
            hMemQLite.i 
            Map Clients.clIDef()   
          EndStructure            
      ;}
      ;{ Macros
        Macro peekaIData(MEM, IData)
          IData = Chr(PeekA(MEM))+Chr(PeekA(MEM+1))+Chr(PeekA(MEM+2))+Chr(PeekA(MEM+3))+Chr(PeekA(MEM+4))+Chr(PeekA(MEM+5))+Chr(PeekA(MEM+6))+Chr(PeekA(MEM+7))
        EndMacro  
        Macro peekqSZchunk(MEM, SZchunk)
          SZchunk = PeekQ(MEM+8)
        EndMacro  
        Macro peekqOFFset(MEM, OFFset)
          OFFset = PeekQ(MEM+16)
        EndMacro  
        Macro peekaCRC(MEM, CRC)
          CRC = Chr(PeekA(MEM+2024))+Chr(PeekA(MEM+2024+1))+Chr(PeekA(MEM+2024+2))+Chr(PeekA(MEM+2024+3))+Chr(PeekA(MEM+2024+4))+Chr(PeekA(MEM+2024+5))+Chr(PeekA(MEM+2024+6))+Chr(PeekA(MEM+2024+7))
        EndMacro  
        Macro peekqSZData(MEM, SZData)
          SZData = PeekQ(MEM+2032)
        EndMacro  
        Macro peekbDAType(MEM, DAType)
          DAType = PeekB(MEM+2040)
        EndMacro  
        
        Macro pokeaIData(MEM, IData)
          PokeA(MEM+0,Asc(Mid(IData,1,1))):PokeA(MEM+1,Asc(Mid(IData,2,1))):PokeA(MEM+2,Asc(Mid(IData,3,1))):PokeA(MEM+3,Asc(Mid(IData,4,1))):PokeA(MEM+4,Asc(Mid(IData,5,1))):PokeA(MEM+5,Asc(Mid(IData,6,1))):PokeA(MEM+6,Asc(Mid(IData,7,1))):PokeA(MEM+7,Asc(Mid(IData,8,1)))
        EndMacro  
        Macro pokeqSZchunk(MEM, SZchunk)
          PokeQ(MEM+8, SZchunk)
        EndMacro  
        Macro pokeqOFFset(MEM, OFFset)
          PokeQ(MEM+16, OFFset)
        EndMacro  
        Macro pokeaCRC(MEM, CRC)
          PokeA(MEM+2024+0,Asc(Mid(CRC,1,1))):PokeA(MEM+2024+1,Asc(Mid(CRC,2,1))):PokeA(MEM+2024+2,Asc(Mid(CRC,3,1))):PokeA(MEM+2024+3,Asc(Mid(CRC,4,1))):PokeA(MEM+2024+4,Asc(Mid(CRC,5,1))):PokeA(MEM+2024+5,Asc(Mid(CRC,6,1))):PokeA(MEM+2024+6,Asc(Mid(CRC,7,1))):PokeA(MEM+2024+7,Asc(Mid(CRC,8,1)))
        EndMacro  
        Macro pokeqSZData(MEM, SZData)
          PokeQ(MEM+2032, SZData)
        EndMacro  
        Macro pokebDAType(MEM, DAType)
          PokeB(MEM+2040, DAType)
        EndMacro  
        ;}  
      ;{ Inits    
        InitNetwork()
        UseMD5Fingerprint()
        UseCRC32Fingerprint()
      ;}

          Procedure CliMain(*SenData, szSenData.q, RawDAType.b, iData.s, ipSrv.s, portSrv.u, typeCon.l, charMod = #PB_UTF8)
            ;{ InitVars
            Protected szInitBytes.a = 24,
                      szFinitBytes.a = 17,
                      szDataBytes.u = #DataBuff - szInitBytes - szFinitBytes,
                      szSenDone.q, szDataChunk.q, offseData.q, szData.q
            ;}
            If szSenData > 0 And Len(iData) = 8
              ;{ InitCon
              Protected Con = OpenNetworkConnection(ipSrv, portSrv, typeCon)
              Protected Len
              ;}
              If Con
                ;{ iNetVars
                Protected rcvStat.b
                Protected *rawData.rawData = AllocateMemory(#DataBuff)
                FillMemory(*rawData, #DataBuff, 0, #PB_Byte)
                
                Protected cliAuthID.q,
                          srvAuthID.q
                ;}
                ;{ CreateInitSenData
                cliAuthID = Random(99999999,10000000)
                PokeA(*rawData, charMod)
                PokeQ(*rawData+1, cliAuthID)
                PokeA(*rawData+9, #False)
                ;}
                If SendNetworkData(Con, *rawData, 10)
                  FillMemory(*rawData, #DataBuff, 0, #PB_Byte)          ; CleanUp
                  Repeat
                    Select NetworkClientEvent(Con)                      ; WaitSignal
                      Case #PB_NetworkEvent_Data
                        Len = ReceiveNetworkData(Con, *rawData, MemorySize(*rawData))
                        If Len = 9                                     ; RecvSrvGUIData
                          ;{ RcvSrvGUIData
                          rcvStat = PeekB(*rawData)
                          srvAuthID = PeekQ(*rawData + 1)
                          
                          Debug "srvAuthID: "+srvAuthID
                          If rcvStat = #rcvStat1
                            Debug "reTrySend10Bytes"
                            FillMemory(*rawData, #DataBuff, 0, #PB_Byte)   ; CleanUp
                          ;}
                          ;{ RECreateSendTrueInitSenData
                            PokeA(*rawData, charMod)
                            PokeQ(*rawData+1, cliAuthID)
                            PokeA(*rawData+9, #True)
                            SendNetworkData(Con, *rawData, 10)
                            FillMemory(*rawData, #DataBuff, 0, #PB_Byte)   ; CleanUp
                          EndIf
                          ;}
                        ElseIf Len = 1
                          rcvStat = PeekB(*rawData)
                          szData = szSenData
                          Debug rcvStat
                          If rcvStat = #rcvStat2                      ; sENData
                            ;{ CreaStaticDetails
                            *rawData\szData = szData;pokeqSZData(*rawData, szSenData)
                            *rawData\rawDAType = RawDAType;pokebDAType(*rawData, RawDAType);*rawData\rawDAType = RawDAType; + 2040)
                            PokeS(*rawData, iData, 8, charMod | #PB_String_NoZero)
                            PokeS(*rawData + szInitBytes + szDataBytes, Fingerprint(*SenData, szSenData, #PB_Cipher_CRC32, #PB_Cipher_SHA2), 8, charMod | #PB_String_NoZero)
                            ;}
                            ;{ CreaDynamicDetails
                            If Mod(szData, szDataBytes) = 0
                              szDataChunk = szDataBytes;*rawData\szDataChunk = szDataBytes
                            Else
                              szDataChunk = Mod(szData, szDataBytes);*rawData\szDataChunk = Mod(szSenData, szDataBytes)
                            EndIf
                            offseData = szData - szDataChunk
                            *rawData\szDataChunk = szDataChunk;pokeqSZchunk(*rawData, szDataChunk)
                            *rawData\offseData = offseData;pokeqOFFset(*rawData, offseData);*rawData\offseData = szSenData - *rawData\szDataChunk
                            ;}
                            ;{ sENData
                            CopyMemory(*SenData + offseData, *rawData + szInitBytes, szDataChunk)
                            If SendNetworkData(Con, *rawData, #DataBuff)
                              szSenDone + szDataChunk
                            EndIf  
                            FillMemory(*rawData, #DataBuff, 0, #PB_Byte)          ; CleanUp
                            ;}
                          ElseIf rcvStat = #rcvStat3              ; SendUpToEndBytes
                            If offseData > 0;szData > szDataBytes
                              ;{ CreaDynamicDetails
                              PokeS(*rawData, iData, 8, charMod | #PB_String_NoZero)
                              szDataChunk = szDataBytes
                              *rawData\szDataChunk = szDataChunk;pokeqSZchunk(*rawData, szDataBytes)
                              offseData - szDataChunk
                              
                              *rawData\offseData = offseData;pokeqOFFset(*rawData, offseData)
                              ;}
                              ;{ SenData
                              CopyMemory(*SenData + offseData, *rawData + szInitBytes, szDataChunk)
                              If SendNetworkData(Con, *rawData, szInitBytes + szDataBytes)
                                szSenDone + szDataChunk
                              EndIf
                              FillMemory(*rawData, #DataBuff, 0, #PB_Byte)          ; CleanUp
                              ;}
                            Else  
                              CloseNetworkConnection(Con)
                              Break
                            EndIf
                          ElseIf rcvStat = #rcvStat4
                            CloseNetworkConnection(Con)
                            Break
                          ElseIf rcvStat = #rcvStat5
                            If offseData > 0;szData > szDataBytes
                              ;{ CreaDynamicDetails
                              PokeS(*rawData, iData, 8, charMod | #PB_String_NoZero)
                              szDataChunk = szDataBytes
                              *rawData\szDataChunk = szDataChunk;pokeqSZchunk(*rawData, szDataBytes)
                              
                              *rawData\offseData = offseData;pokeqOFFset(*rawData, offseData)
                              ;}
                              ;{ SenData
                              CopyMemory(*SenData + offseData, *rawData + szInitBytes, szDataChunk)
                              If SendNetworkData(Con, *rawData, szInitBytes + szDataBytes)
                                szSenDone + szDataChunk
                              EndIf
                              FillMemory(*rawData, #DataBuff, 0, #PB_Byte)          ; CleanUp
                              ;}
                            Else  
                              CloseNetworkConnection(Con)
                              Break
                            EndIf
                          EndIf  
                            
                        EndIf
                        
                        Len = -1
                        
                      Case #PB_NetworkEvent_None
                    EndSelect
                    Delay(1)
                  ForEver
                 
                EndIf
                
                FreeMemory(*rawData)
               
              EndIf
              
            EndIf  
              
          EndProcedure
          
          Define hFile = OpenFile(#PB_Any, "c:\temp\1.zip")
          If hFile
            Define szFile = Lof(hFile)
            Define *memFile = AllocateMemory(szFile)
              ReadData(hFile, *memFile, szFile)
              CloseFile(hFile)
              CliMain(*memFile, szFile, #rawDAType_txtMSG, "A1b2C3d4", "127.0.0.1", 56789, #PB_Network_TCP|#PB_Network_IPv4, #PB_Ascii)
              FreeMemory(*memFile)
          EndIf
User avatar
mk-soft
Always Here
Always Here
Posts: 5409
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Solved: Client Server Send Data randomly corruption

Post by mk-soft »

I have not tested your code.
But it strikes me also that you do not evaluate the length of ReceiveNetworData correctly.

The best way is to first read a header with the following bytes from the receive buffer. So read only as much and as long as the header is complete. Then create a memory that contains the size of the data of the following bytes and read only up to the length of the data from the receive buffer. Then start the evaluation of the data.

The TCP/IP protocol only takes care that data up to 64kB is checked and arrives in the correct order. ISO layer 1 to 4.
The actual length of the data is your responsibility to ensure that it is complete. ISO layer 5 to 7.

You should not read more than the length of the header and data from the receive buffer. It is possible that the headers and data from the next protocol sent are already partly or completely in the receive buffer.

Here an example of structures

Code: Select all

;- Example Network Data

; Header like Modbus/TCP
Structure netHeader
  TransactionID.l
  ProtocolID.l
  DataLen.l
EndStructure

Structure netDataStatic ; ProtocolID 1
  lVal.l
  fltVal.f
  Char.a[80] ; ASCII String Len 80
EndStructure

Structure netDataDynamics ;  ; ProtocolID 2
  StructureUnion
    Byte.b[0]
    Char.a[0]
  EndStructureUnion
EndStructure

Structure netData
  StructureUnion
    Data1.netDataStatic
    Data2.netDataDynamics
  EndStructureUnion
EndStructure

Structure netClientData
  ConnectionID.i
  TimeUpdate.i
  ; Len of received data
  ActLenHeader.i
  ActLenData.i
  ; Buffer for Header
  Header.netHeader
  ; Pointer to Data. Allocate with AllocateMemory with size of Header\DataLen
  *Data.netData
EndStructure
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
LiK137
Enthusiast
Enthusiast
Posts: 282
Joined: Wed Jun 23, 2010 5:13 pm

Re: Solved: Client Server Send Data randomly corruption

Post by LiK137 »

hi mk-soft,
could You please give a small example of your recommendation.
And You wrote "So read only as much and as long as the header is complete. Then create a memory that contains the size of the data of the following bytes..."
You mean each time reallocate memory with new size? better if You give example
User avatar
mk-soft
Always Here
Always Here
Posts: 5409
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Solved: Client Server Send Data randomly corruption

Post by mk-soft »

I have a small example on the fast not ready, but a complete module for data exchange over TCP/IP with own headers.

viewtopic.php?f=12&t=73882
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
Post Reply