J'ai besoin de transférer des gros blocs par sockets, donc je suis obligé de "tronçonner" en plusieurs messages.
Mon problème est que dès le 2ème appel à send(), l'appli de bloque car le recepteur n'a pas fini le traitement du 1er send().
Le problème disparait si je mets une tempo après chaque send.
Est-ce qu'il est possible de savoir, après avoir fait un send() si le recepteur l'a consommé et s'il est prêt à en recevoir un
nouveau ?
Pour des raisons de performance et de simplicité, je voudrais éviter de devoir faire un recv() entre 2 send() même si ça peut
résoudre le problème de synchro.
J'ai besoin de transférer des gros blocs par sockets, donc je suis obligé de "tronçonner" en plusieurs messages.
Mon problème est que dès le 2ème appel à send(), l'appli de bloque car le recepteur n'a pas fini le traitement du 1er send().
Le problème disparait si je mets une tempo après chaque send.
Est-ce qu'il est possible de savoir, après avoir fait un send() si le recepteur l'a consommé et s'il est prêt à en recevoir un
nouveau ?
Pour des raisons de performance et de simplicité, je voudrais éviter de devoir faire un recv() entre 2 send() même si ça peut
résoudre le problème de synchro.
J'ai besoin de transférer des gros blocs par sockets, donc je suis obligé de "tronçonner" en plusieurs messages.
Mon problème est que dès le 2ème appel à send(), l'appli de bloque car le recepteur n'a pas fini le traitement du 1er send().
Le problème disparait si je mets une tempo après chaque send.
Est-ce qu'il est possible de savoir, après avoir fait un send() si le recepteur l'a consommé et s'il est prêt à en recevoir un
nouveau ?
Pour des raisons de performance et de simplicité, je voudrais éviter de devoir faire un recv() entre 2 send() même si ça peut
résoudre le problème de synchro.
Je reformule ma question : pour transferer des gros messages (plusieurs Mo) j'ai besoin de les découper en plusieurs blocs, dont
la taille est celui de mon buffer emission/réception socket (pour l'intant 8ko).
Chaque bloc a une entête : No bloc courant, Nb total blocs, taille du bloc courant, taille du message complet, ce qui permet de
les réassembler sans problème.
Ma question est : pour envoyer le message complet, est-il possible de faire uniquement une succession de send() pour chaque
bloc, ou alors un recv() entre l'émission de 2 blocs est nécessaires pour être sûr que le recepteur est prêt à recevoir le bloc
suivant ?
Je pose la question parce que j'ai déjà vu la même chose sur un analyseur de protocole, et la synchro entre 2 blocs était faite
uniquement au niveau tcp et pas au niveau applicatif, et le débit était proche du maximum que permet Ethernet (c'était pour un
transfert de blob d'une base de données).
Je ne pense pas que le mode opératoire des sockets (bloquant ou pas) permet de savoir si le récepteur est prêt à recevoir ou en
cours de traitement.
Je reformule ma question : pour transferer des gros messages (plusieurs Mo) j'ai besoin de les découper en plusieurs blocs, dont
la taille est celui de mon buffer emission/réception socket (pour l'intant 8ko).
Chaque bloc a une entête : No bloc courant, Nb total blocs, taille du bloc courant, taille du message complet, ce qui permet de
les réassembler sans problème.
Ma question est : pour envoyer le message complet, est-il possible de faire uniquement une succession de send() pour chaque
bloc, ou alors un recv() entre l'émission de 2 blocs est nécessaires pour être sûr que le recepteur est prêt à recevoir le bloc
suivant ?
Je pose la question parce que j'ai déjà vu la même chose sur un analyseur de protocole, et la synchro entre 2 blocs était faite
uniquement au niveau tcp et pas au niveau applicatif, et le débit était proche du maximum que permet Ethernet (c'était pour un
transfert de blob d'une base de données).
Je ne pense pas que le mode opératoire des sockets (bloquant ou pas) permet de savoir si le récepteur est prêt à recevoir ou en
cours de traitement.
Je reformule ma question : pour transferer des gros messages (plusieurs Mo) j'ai besoin de les découper en plusieurs blocs, dont
la taille est celui de mon buffer emission/réception socket (pour l'intant 8ko).
Chaque bloc a une entête : No bloc courant, Nb total blocs, taille du bloc courant, taille du message complet, ce qui permet de
les réassembler sans problème.
Ma question est : pour envoyer le message complet, est-il possible de faire uniquement une succession de send() pour chaque
bloc, ou alors un recv() entre l'émission de 2 blocs est nécessaires pour être sûr que le recepteur est prêt à recevoir le bloc
suivant ?
Je pose la question parce que j'ai déjà vu la même chose sur un analyseur de protocole, et la synchro entre 2 blocs était faite
uniquement au niveau tcp et pas au niveau applicatif, et le débit était proche du maximum que permet Ethernet (c'était pour un
transfert de blob d'une base de données).
Je ne pense pas que le mode opératoire des sockets (bloquant ou pas) permet de savoir si le récepteur est prêt à recevoir ou en
cours de traitement.
>> la taille est celui de mon buffer emission/réception socket (pour
l'intant 8ko).
Tu perux monter plus haut que ca, mais meme si ca a des consequence au
niveau reseau. Tu peux te documenter sur ce genre de données sur le Web
ou dans un bouquin.
Notons que ca n'a pas forcement d'interet. Si tu fais du TCP, tu sais
que tout
arrive et ta suite de message est un stream. Donc tu fais une entete
pour le bloc
complet et tu l'envois en plusieurs appels a send... Bien sur si tu
fais de l'UDP
alors, il faut faire pour pouvoir assembler dans l'ordre et voir s'il y
a eu
perte.
Sinon, dans TCP, il ne faut pas oublié notre ami NAGGLE. C'est un algo
qui essaye de regrouper les paquet TCP avant de les envoyer sur le
réseau
(pour des questions de performances). Tu peux essayer de le desactiver
pour voir ce qu'il se passe (perso je le fait car cela me penalisait).
Voici
un extrait de mon code:
100 MB utiles ! Y'a tous les protocoles (ethernet puis IP et enfin
TCP) qui ajoute entete + padding... il n'y a qu'a regarder avec
Ethereal
pour s'en convaincre...
Je ne pense pas que le mode opératoire des sockets (bloquant ou pas)
permet de savoir si le récepteur est prêt à recevoir ou en cours de
traitement.
Non, mais tu ne serait pas bloque, et tu pourrais faire autre chose...
Puis
revenir faire ton send. Ca se fait dans certains cas.
>> la taille est celui de mon buffer emission/réception socket (pour
l'intant 8ko).
Tu perux monter plus haut que ca, mais meme si ca a des consequence au
niveau reseau. Tu peux te documenter sur ce genre de données sur le Web
ou dans un bouquin.
Notons que ca n'a pas forcement d'interet. Si tu fais du TCP, tu sais
que tout
arrive et ta suite de message est un stream. Donc tu fais une entete
pour le bloc
complet et tu l'envois en plusieurs appels a send... Bien sur si tu
fais de l'UDP
alors, il faut faire pour pouvoir assembler dans l'ordre et voir s'il y
a eu
perte.
Sinon, dans TCP, il ne faut pas oublié notre ami NAGGLE. C'est un algo
qui essaye de regrouper les paquet TCP avant de les envoyer sur le
réseau
(pour des questions de performances). Tu peux essayer de le desactiver
pour voir ce qu'il se passe (perso je le fait car cela me penalisait).
Voici
un extrait de mon code:
100 MB utiles ! Y'a tous les protocoles (ethernet puis IP et enfin
TCP) qui ajoute entete + padding... il n'y a qu'a regarder avec
Ethereal
pour s'en convaincre...
Je ne pense pas que le mode opératoire des sockets (bloquant ou pas)
permet de savoir si le récepteur est prêt à recevoir ou en cours de
traitement.
Non, mais tu ne serait pas bloque, et tu pourrais faire autre chose...
Puis
revenir faire ton send. Ca se fait dans certains cas.
>> la taille est celui de mon buffer emission/réception socket (pour
l'intant 8ko).
Tu perux monter plus haut que ca, mais meme si ca a des consequence au
niveau reseau. Tu peux te documenter sur ce genre de données sur le Web
ou dans un bouquin.
Notons que ca n'a pas forcement d'interet. Si tu fais du TCP, tu sais
que tout
arrive et ta suite de message est un stream. Donc tu fais une entete
pour le bloc
complet et tu l'envois en plusieurs appels a send... Bien sur si tu
fais de l'UDP
alors, il faut faire pour pouvoir assembler dans l'ordre et voir s'il y
a eu
perte.
Sinon, dans TCP, il ne faut pas oublié notre ami NAGGLE. C'est un algo
qui essaye de regrouper les paquet TCP avant de les envoyer sur le
réseau
(pour des questions de performances). Tu peux essayer de le desactiver
pour voir ce qu'il se passe (perso je le fait car cela me penalisait).
Voici
un extrait de mon code:
100 MB utiles ! Y'a tous les protocoles (ethernet puis IP et enfin
TCP) qui ajoute entete + padding... il n'y a qu'a regarder avec
Ethereal
pour s'en convaincre...
Je ne pense pas que le mode opératoire des sockets (bloquant ou pas)
permet de savoir si le récepteur est prêt à recevoir ou en cours de
traitement.
Non, mais tu ne serait pas bloque, et tu pourrais faire autre chose...
Puis
revenir faire ton send. Ca se fait dans certains cas.
C'est bien du TCP. Sans entête, je ne comprends pas comment le recepteur peut faire la distinction à l'arriver d'un nouveau bloc
entre la suite d'un gros message et un nouveau message.
Bien que je ne connaisse pas l'ordre de grandeur, mon but est que les blocs soient suffisamment grands pour éviter ce genre de
problème.
Tout à fait, c'est le test que j'ai fait. Quand on arrive à 50mb de débit de données utiles sur une ligne à 100mb, on est
content. C'est mon objectif.
Pour l'instant j'ai fait le choix de socket bloquant, avec un thread par socket. L'idéal serait sans doute la complétion de
port, mais j'ai encore du chemin à faire.
C'est bien du TCP. Sans entête, je ne comprends pas comment le recepteur peut faire la distinction à l'arriver d'un nouveau bloc
entre la suite d'un gros message et un nouveau message.
Bien que je ne connaisse pas l'ordre de grandeur, mon but est que les blocs soient suffisamment grands pour éviter ce genre de
problème.
Tout à fait, c'est le test que j'ai fait. Quand on arrive à 50mb de débit de données utiles sur une ligne à 100mb, on est
content. C'est mon objectif.
Pour l'instant j'ai fait le choix de socket bloquant, avec un thread par socket. L'idéal serait sans doute la complétion de
port, mais j'ai encore du chemin à faire.
C'est bien du TCP. Sans entête, je ne comprends pas comment le recepteur peut faire la distinction à l'arriver d'un nouveau bloc
entre la suite d'un gros message et un nouveau message.
Bien que je ne connaisse pas l'ordre de grandeur, mon but est que les blocs soient suffisamment grands pour éviter ce genre de
problème.
Tout à fait, c'est le test que j'ai fait. Quand on arrive à 50mb de débit de données utiles sur une ligne à 100mb, on est
content. C'est mon objectif.
Pour l'instant j'ai fait le choix de socket bloquant, avec un thread par socket. L'idéal serait sans doute la complétion de
port, mais j'ai encore du chemin à faire.
Merci pour toutes ces explications.
Je me demande si la commande TransmitFile avec l'option en mémoire ne pourrait pas résoudre mon problème de tranfert, je vais
approfondir.
Merci pour toutes ces explications.
Je me demande si la commande TransmitFile avec l'option en mémoire ne pourrait pas résoudre mon problème de tranfert, je vais
approfondir.
Merci pour toutes ces explications.
Je me demande si la commande TransmitFile avec l'option en mémoire ne pourrait pas résoudre mon problème de tranfert, je vais
approfondir.
Merci pour toutes ces explications.
Je me demande si la commande TransmitFile avec l'option en mémoire ne pourrait pas résoudre mon problème de tranfert, je vais
approfondir.
Merci pour toutes ces explications.
Je me demande si la commande TransmitFile avec l'option en mémoire ne pourrait pas résoudre mon problème de tranfert, je vais
approfondir.
Merci pour toutes ces explications.
Je me demande si la commande TransmitFile avec l'option en mémoire ne pourrait pas résoudre mon problème de tranfert, je vais
approfondir.
> Encore une fois, la question est qu'est-ce que tu veux faire ? C'est
sur
la meme machine ? Non, puisque tu parles de reseaux. Seule une reponse
precise a cette question ainsi qu'aux impératifs qui en decoulent
pourront
te guider dans tes choix.
> Encore une fois, la question est qu'est-ce que tu veux faire ? C'est
sur
la meme machine ? Non, puisque tu parles de reseaux. Seule une reponse
precise a cette question ainsi qu'aux impératifs qui en decoulent
pourront
te guider dans tes choix.
> Encore une fois, la question est qu'est-ce que tu veux faire ? C'est
sur
la meme machine ? Non, puisque tu parles de reseaux. Seule une reponse
precise a cette question ainsi qu'aux impératifs qui en decoulent
pourront
te guider dans tes choix.