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)
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