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 39 40 41 42 43 44 45 46 47 48 49
| int
sendtoUDP (int s, const void *msg, size_t len, int flags, const struct sockaddr *to, socklen_t tolen)
{
int lengthdata_to_send, payload_free;
int i;
ssize_t slen;
struct UDPframe_struct *UDPframe;
char *UDPdata;
/* definition de l'espace disponible pour les données que l'on souhaite transmettre. espace normalement disponible - la taille du header de fragmentation UDP */
payload_free = dataUDPframe - UDPH_SIZE;
/* allocation de l'espace mémoire pour les données à envoyées par la session UDP */
UDPframe = (struct UDPframe_struct *)malloc(sizeof(struct UDPheader_struct) + payload_free);
UDPdata = (char *)&UDPframe->UDPdata;
UDPframe->UDPheader.UDPframe_size = len + UDPH_header;
UDPframe->UDPheader.ID_UDPframe = msg[11]; /* On utilise le dernier octet du timestamp de la trame détectée comme ID de fragmentation */
if(len > payload_free){
if(len % payload_free == 0){
UDPframe->UDPheader.total_packets = len / payload_free; /* len est un multiple du payload */
}
else{
UDPframe->UDPheader.total_packets = 1 + len / payload_free; /* len n'est pas un multiple du payload */
}
}
for (i = 1; i <= UDPframe->UDPheader.total_packets; i ++){
if(len - (i * payload_free) > payload_free){
lengthdata_to_send = payload_free;
}
else{
lengthdata_to_send = len - ((i-1) * payload_free);
}
/* copy des données à envoyées dans la structure de la fragmantation de la trame */
bcopy(msg + ((i-1) * payload_free), UDPdata, lengthdata_to_send);
/* Ecriture du numéro du packet dans l'en-tête de fragmentation */
UDPframe->UDPheader.packet_number = i;
/* Envoi du paquet */
slen=sendto(s, (void *)UDPframe, sizeof(struct UDPheader_struct) + lengthdata_to_send, flags, to, tolen);
return slen;
}
} |
Partager