2010-05-14 4 views
2

Je suis en train de développer un robot IRC simple. D'abord je veux penser à un design approprié pour ce projet. L'une des choses que je me pose en ce moment est le mécanisme de lecture. Je développe ce bot sur un système Linux. (Fedora 12) Pour lire depuis une socket, j'utilise l'appel système "read()". Je prévois d'utiliser la fonctionnalité de lecture de la façon suivante (code juste un exemple non quelque chose du produit final.):Mise en mémoire tampon des données de flux

while (uBytesRead = read(iServerSocket, caBuffer, MAX_MESSAGE_SIZE)) 
{ 
    //1. Parse the buffer and place it into a Message structure. 
    //2. Add the message structure to a linked list that will act as a queue of message that are to be processed. 
} 

Ce code sera exécuté dans son propre fil. J'ai choisi cette option car je voulais qu'il y ait le moins de retard possible entre les lectures. (écrit sera mis en œuvre de la même manière) Tout cela est légèrement basé sur des hypothèses, que je voudrais éclaircir. Ma question est la suivante: que se passe-t-il si vous recevez tellement de données à un rythme si rapide que la lecture et le traitement des données (dans ce cas, l'analyse) sont plus lents que la vitesse de transmission des données. sera tamponné par le système. Est-ce une bonne hypothèse? Et si oui:

  1. Quelle est la taille de ce tampon?
  2. Que se passe-t-il avec les données entrantes lorsque ce tampon est plein?
  3. Pour que mon application soit protégée contre le spam, comment puis-je le traiter au mieux?

J'espère avoir expliqué mon problème assez clairement.

Merci d'avance.

Répondre

1

IRC utilise des sockets TCP pour la mise en réseau. Les sockets Linux/Posix TCP ont un tampon de données à envoyer et un autre à recevoir. Vous pouvez redimensionner les tampons avec setsockopt() et SO_SNDBUF/SO_RCVBUF.

TCP dispose d'un contrôle de flux, de sorte que lorsqu'un tampon de réception est plein, le système d'exploitation envoie un avis de congestion. Les paquets reçus qui ne rentrent pas dans le tampon ne seront pas reconnus par le récepteur et seront finalement retransmis par l'expéditeur.

Donc, ce n'est pas à vous inquiéter. Ce qui compte, c'est ce que fait le programme de l'expéditeur lorsque le tampon d'envoi de son socket est plein. Certains programmes fermeront la socket, d'autres supprimeront simplement les données écrites et réessayeront, alors que d'autres pourraient mettre en mémoire tampon en interne.

+1

Aha ok ça éclaircit les choses. Le protocole IRC énonce quelques règles concernant le contrôle d'inondation, donc je pense que la question d'un tampon d'envoi se remplissant du côté serveur ne sera pas vraiment un problème. Je me demandais comment ça fonctionnait. J'ai regardé la page MAN pour lire mais ça ne m'a pas beaucoup plu sur ce sujet, alors merci beaucoup! – Beldoroon

Questions connexes