y a rien à inventé par dessus, juste à mettre en place un mécanisme de bonne réception & envoie de donné , peu importe la norme sous jacente...
le principal , c'est de pouvoir envoyer de la data correctement, et le client de reconstitué le message à l'arrivé correctement aussi.
là, tu envois des données en bordel sans contrôler si l'envois à bien été effectué avec
SendNetworkData() :
Renvoie le nombre d'octets qui ont été effectivement envoyés.
S'il n'est pas égal à 'LongueurMemoireTampon', la mémoire tampon de réception de l'utilisateur est probablement pleine.
Si rien n'a pu être envoyé alors 'Resultat' sera égal à -1.
et aucun contrôle coté réception , il peut recevoir des données partielles , le client ne le saura pas si il y a un echec coté serveur.
je ne vais pas te codé le truc complet , mais voici l'idée :
Code : Tout sélectionner
#PACKET_SIZE = 15
Enumeration
#PROTOCOL_BEGIN_SEND_MESSAGE ; [ ID ] [ CHECKSUM ] [ SIZE ( 4 BYTES ) ] [ DATAS ]
#PROTOCOL_SEND_MESSAGE ; [ ID ] [ CHECKSUM ] [inused] [ DATA ]
#PROTOCOL_END_MESSAGE ; [ ID ] [ CHECKSUM ] [inused] [ DATA ]
#PROTOCOL_BEGIN_END_SEND_MESSAGE ; [ ID ] [ CHECKSUM ] [ SIZE ( 4 BYTES ) ] [ DATAS ]
EndEnumeration
#HEADER_SIZE = 9
Structure Packet ;--
id.c ; |---> 4096 !
checksum.l ; |
size.l
*data ; |
EndStructure ;--
Global NewList *PacketToSend.Packet()
Procedure SendMessage(*data, size.l)
Protected checksum.l = 0 ; fct de checksum ici !
; le paquet est trop gros
If size + #HEADER_SIZE > #PACKET_SIZE
AddElement(*PacketToSend())
*PacketToSend() = AllocateStructure(Packet)
*PacketToSend()\id = #PROTOCOL_BEGIN_SEND_MESSAGE
*PacketToSend()\checksum = checksum
*PacketToSend()\size = #PACKET_SIZE - #HEADER_SIZE
*PacketToSend()\data = AllocateMemory(*PacketToSend()\size)
CopyMemory(*data, *PacketToSend()\data , *PacketToSend()\size)
sizeToSend = (size-#HEADER_SIZE) - (#PACKET_SIZE - #HEADER_SIZE)
nbPacket = sizeToSend / (#PACKET_SIZE - #HEADER_SIZE)
offset = #PACKET_SIZE - #HEADER_SIZE
If nbPacket > 1 ; il y a plus d'un paquet à envoyer
; on génère les paquet intermédiaire
For i = 0 To nbPacket-2
AddElement(*PacketToSend())
*PacketToSend() = AllocateStructure(Packet)
*PacketToSend()\id = #PROTOCOL_SEND_MESSAGE
*PacketToSend()\checksum = checksum
*PacketToSend()\size = #PACKET_SIZE - #HEADER_SIZE
*PacketToSend()\data = AllocateMemory(#PACKET_SIZE - #HEADER_SIZE)
CopyMemory(*data+offset, *PacketToSend()\data , #PACKET_SIZE - #HEADER_SIZE)
offset + (#PACKET_SIZE - #HEADER_SIZE)
Next
; le paquet de fin
AddElement(*PacketToSend())
*PacketToSend() = AllocateStructure(Packet)
*PacketToSend()\id = #PROTOCOL_END_MESSAGE
*PacketToSend()\checksum = checksum
*PacketToSend()\size = size - offset
*PacketToSend()\data = AllocateMemory(#PACKET_SIZE - #HEADER_SIZE)
CopyMemory(*data+offset, *PacketToSend()\data , *PacketToSend()\size)
Else
; le paquet de fin
AddElement(*PacketToSend())
*PacketToSend() = AllocateStructure(Packet)
*PacketToSend()\id = #PROTOCOL_END_MESSAGE
*PacketToSend()\checksum = checksum
*PacketToSend()\size = size - offset
*PacketToSend()\data = AllocateMemory(#PACKET_SIZE - #HEADER_SIZE)
CopyMemory(*data+offset, *PacketToSend()\data , *PacketToSend()\size)
EndIf
Else
; le message de base est plus petit que la taille d'un paquet :
AddElement(*PacketToSend())
*PacketToSend() = AllocateStructure(Packet)
*PacketToSend()\id = #PROTOCOL_BEGIN_END_SEND_MESSAGE
*PacketToSend()\checksum = checksum
*PacketToSend()\size = size
*PacketToSend()\data = AllocateMemory(#PACKET_SIZE - #HEADER_SIZE)
CopyMemory(*data, *PacketToSend()\data , size)
EndIf
EndProcedure
; tu envois ton message entier ici !
SendMessage(?message,(?tag-?message))
; juste pour le controle
p = 0
ForEach *PacketToSend()
Debug "paquet numero : " + Str(p)
Debug "id : " + Str(*PacketToSend()\id )
Debug "size : " + Str(*PacketToSend()\size)
For i = 0 To *PacketToSend()\size - 1
Debug "data : " + PeekA(*PacketToSend()\data+i)
Next
Debug ""
p+1
; tu fait le sendnetwork ici !
Next
DataSection
message:
Data.a 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38
tag:
EndDataSection
Les messages trop gros, peu importe ce que tu veut envoyer, est découpé correctement.