CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Implémentation du protocole TFTP en C

ZZeetopp
ZZeetopp
Niveau 4
24 avril 2016 à 20:28:01

Bonjour à tous,

Pour un projet de fin d'année en réseau, je dois réaliser une implémentation du protocole TFTP en C (selon la norme RFC 1350 : https://tools.ietf.org/html/rfc1350) avec les gestion des options (norme RFC 2347 https://tools.ietf.org/html/rfc2347).

J'ai un problème pour construire un paquet OACK. Sur mon sujet, le prototype de la fonction est fourni comme suit :

int tftp_make_oack(char *buffer, size_t *length, uint16_t bloc, size_t nbytes, size_t nblocks);

D'après ce que j'ai compris :

  • buffer correspond au tampon qui contiendra le paquet.
  • length contient la taille du tampon et contiendra la taille finale du paquet.
  • bloc ?
  • nbytes contient le nombre d'octets de chaque bloc.
  • nblocks RFC 2348 http://www.rfc-editor.org/rfc/rfc2348.txt

Donc mon problème c'est l'argument bloc, je ne comprends pas son utilité.

Pour rappel, voici la forme d'un paquet OACK :

+-------+---~~---+---+---~~---+---+---~~---+---+---~~---+---+
|  opc  |  opt1  | 0 | value1 | 0 |  optN  | 0 | valueN | 0 |
+-------+---~~---+---+---~~---+---+---~~---+---+---~~---+---+

Où :

  • opc est l'opcode du paquet (6 pour un OACK).
  • opt1 est le nom de la première option.
  • value1 est la valeur de la première option.

Les 0 sont le caractère de fin de chaîne.

Vous avez une idée de ce que peut-etre l'argument bloc dans la fonction ? Je vois pas du tout à quoi il peut servir parce que j'arrive à construire le paquet sans cet argument. Je doute que ce soit une erreur du sujet.

Merci :hap:

Message édité le 24 avril 2016 à 20:30:48 par ZZeetopp
ZZeetopp
ZZeetopp
Niveau 4
24 avril 2016 à 20:42:42

Je peux plus éditer mon message et j'ai une petite précision à apporter :
Mon paquet OACK devra ressembler à ça :

+-------+-------+---+------+---+------------+---+---+---+
|  6  | blksize | 0 | 1024 | 0 | windowsize | 0 | 5 | 0 |
+-----+---------+---+------+---+------------+---+---+---+

J'ai déjà réussi, mais sans utiliser l'argument bloc, ce qui n'est pas normal.
Voici mon code :

int tftp_make_oack(char *buffer, size_t *length, size_t nbytes, size_t nblocks) {
  // Vérifie les arguments
  if (buffer == NULL || length == NULL) {
    return EARGU;
  }
  
  if (nbytes < 8 || nbytes > 65464) {
    return EARGU;
  }
  
  if (nblocks < 1 || nblocks > 65535) {
    return EARGU;
  }
  
  // Construit le paquet
  char snbytes[6];
  char snblocks[6];
  uint16_t opcode = htons(OACK);
  
  sprintf(snbytes, "%zu", nbytes);
  sprintf(snblocks, "%zu", nblocks);
  
  memset(buffer, 0, *length);
  *length = 0;
  memcpy(buffer, &opcode, sizeof(uint16_t));
  *length += sizeof(uint16_t);
  memcpy(buffer + *length, "blksize", strlen("blksize") + 1);
  *length += sizeof(char) * (strlen("blksize") + 1);
  memcpy(buffer + *length, snbytes, strlen(snbytes) + 1);
  *length += sizeof(char) * (strlen(snbytes) + 1);
  memcpy(buffer + *length, "windowsize", strlen("windowsize") + 1);
  *length += sizeof(char) * (strlen("windowsize") + 1);
  memcpy(buffer + *length, snblocks, strlen(snblocks) + 1);
  *length += sizeof(char) * (strlen(snblocks) + 1);
  
  return 0;
}
Message édité le 24 avril 2016 à 20:43:40 par ZZeetopp
psdal
psdal
Niveau 9
25 avril 2016 à 21:45:34

Quelqu'un a déjà fait ça avant toi : https://github.com/labcoder/simple-tftp

et sûrement d'autres :oui:

inutile de réinventer la roue n'est-ce pas ? :ok:

Sancho114
Sancho114
Niveau 10
25 avril 2016 à 22:24:30

Le 25 avril 2016 à 21:45:34 psdal a écrit :
Quelqu'un a déjà fait ça avant toi : https://github.com/labcoder/simple-tftp

et sûrement d'autres :oui:

inutile de réinventer la roue n'est-ce pas ? :ok:

A mon avis ça lui servira à avoir son année :hap:

psdal
psdal
Niveau 9
26 avril 2016 à 17:41:20

Ouais j'suis pas contre.

Mais perso j'trouve ça hyper débile de ne pas essayer d'innover (créer un nouveau protocole :cool:, faire des apps node/websockets :bave: quand on le peut), ça m'étonnerait que les règles de projet soient si strictes qu'on ne puisse pas faire un truc original...

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment