C++ programmation socket taille Max de socket TCP/IP Buffer?
Je suis à l'aide de C++ les sockets TCP/IP. Selon mes exigences à mon client de se connecter à un serveur et de lire les messages envoyés par (c'est quelque chose de vraiment nouveau, n'est-ce pas) mais... dans mon application, je dois attendre un certain temps (généralement 1 à 2 heures) avant que je commence la lecture des messages (par le biais de recv() ou read()) et le serveur conserve encore sur l'envoi de messages.
Je veux savoir si il y a une limite sur la capacité de la mémoire tampon qui permet de conserver ces messages dans le cas où ils ne sont pas lus et dont la mémoire physique est utilisé pour le tampon de ces messages? De l'expéditeur ou du destinataire?
Cela semble comme une bête exigence. Le flux TCP peut bien bloquer sur le serveur lorsque l'espace de mémoire tampon est pleine au client. Le serveur d'espace de mémoire tampon obtenez ensuite rempli avec des messages non envoyés, impact sur les autres clients. Pouvez-vous donner plus de détails? Ne pouvez-vous pas le tampon des messages du client utilisateur de l'espace et de les traiter après le temps d'attente?
OriginalL'auteur Rampal Chaudhary | 2012-10-17
Vous devez vous connecter pour publier un commentaire.
De données TCP est tamponné à la fois l'expéditeur et le récepteur. La taille du récepteur de la prise du tampon de réception détermine la quantité de données peut être en vol sans accusé de réception, et la taille de l'expéditeur du tampon d'envoi détermine la quantité de données peut être envoyé avant de l'expéditeur bloque ou devient EAGAIN/EWOULDBLOCK, en fonction de blocage/non mode de blocage. Vous pouvez définir ces socket tampons aussi grand que vous le souhaitez jusqu'à 2^32-1 octets, mais si vous définissez le client tampon de réception supérieur à 2^16-1 vous devez le faire avant de brancher la prise, de sorte que le TCP window scaling peut être négocié dans les connecter poignée de main, de sorte que la partie supérieure de 16 bits peuvent entrer en jeu. [Le serveur tampon de réception n'est pas pertinent ici, mais si vous le réglez >= 64 ko, vous devez le régler sur la socket d'écoute, d'où il sera héritée par accepté sockets, de nouveau, de sorte que la poignée de main peut négocier échelle de la fenêtre.]
Cependant je suis entièrement d'accord avec Martin James que c'est un idiot exigence. Ça gâche un fil, une pile de thread, une douille, une grande prise de tampon d'envoi, un FD, et toutes les autres ressources associées au serveur pendant deux heures, et, éventuellement, sur d'autres threads et donc d'autres clients. Il également, à tort, donne le serveur l'impression que deux heures de données a été reçu, quand il a vraiment été transmis à la mémoire tampon de réception, ce qui peut conduire à des inconnus complications dans les situations de récupération: par exemple, le serveur est peut-être pas en mesure de reconstruire les données envoyées si longtemps à l'avance. Vous feriez mieux de ne pas la connexion jusqu'à ce que vous êtes prêt à commencer à recevoir les données, ou bien de la lecture et de file d'attente les données pour vous-même au client pour un traitement ultérieur.
OriginalL'auteur user207421