2010-07-08 7 views
2

Est-il possible d'avoir le bloc fonction d'envoi de winsock jusqu'à ce que le paquet envoyé soit reçu à l'autre extrémité?Avoir le bloc fonction d'envoi de winsock?

Mon but final est de pouvoir envoyer des fichiers 5-20mb tout en étant capable d'envoyer de petits paquets de 1kb sur la même connexion. Donc je pensais que je l'aurais bloqué jusqu'à ce que le récepteur reçoive le paquet. De cette façon, si un autre petit paquet est mis en file d'attente, il ne sera pas bloqué en attente du transfert du reste du gros fichier.

Répondre

0

Non. Et vous n'avez pas besoin de le faire.

+0

Donc, si j'envoie un gros paquet puis un plus petit, tcp enverra-t-il le petit alors qu'il envoie encore le gros? – user230821

+1

TCP est juste un flux, si vous faites un appel send(), cela peut prendre plusieurs appels recv() pour lire ces données de l'autre côté. Inversement, plusieurs appels send() peuvent être fusionnés et lus avec un appel recv(). Vous devez construire votre propre protocole au-dessus de TCP si vous voulez envoyer des "paquets", ou obtenir une réponse quand un paquet/message a été reçu. – nos

+0

Etes-vous sûr? Je pensais que le but de tcp est de faire ce genre de gestion pour vous. Je n'ai jamais eu le temps d'envoyer plusieurs paquets à la fois seront fusionnés en 1 lors de leur réception. – user230821

0

Je ne suis pas sûr de ce que nous obtiendrions avec ceci. Le mélange du trafic sur le flux TCP ne servira à rien. Pouvez-vous expliquer ce que vous devez faire exactement ... Surtout, nous ne pouvons jamais être sûrs dans TCP que l'autre application a effectivement reçu le pkt (il pourrait juste être dans leurs tampons tcp) ...

2

Utilisez simplement deux connexions TCP séparées. Ils peuvent même se connecter au même hôte et port, le numéro de port à votre fin sera différent. L'établissement d'une liaison d'attente et d'arrêt sur n'importe quel réseau (c'est-à-dire sans bouclage) serait lamentablement lent.

+0

ou peut-être _n_ connexions distinctes .. :) +1 pour les connexions multiples cependant – Default

1

Vous pouvez envoyer la taille de vos colis à la place

struct MyNetworkPackage { 
    int size; 
    char* data; 
}; 

si vous commencez par l'envoi de la taille, vous pouvez déduire de l'autre côté les données appartenant à ce paquet.
J'ai aussi essayé d'expliquer winsock en this answer.

0

Il semble que 'send' bloquera si un paquet précédent est encore envoyé.