2011-01-25 6 views
3

I a établi une connexion avec un client de cette façon:limitation de la mémoire tampon de réception

gen_tcp:listen(1234,[binary,{packet,0},{reuseaddr,true},{active,false},{recbuf,2048}]). 

Ce code effectue le traitement des messages:

loop(Socket)-> 
    inet:setops(Socket,[{active,once}], 
    receive 
     {tcp,Socket,Data}-> 
      handle(Data), 
      loop(Socket); 
     {Pid,Cmd}-> 
      gen_tcp:send(Socket,Cmd), 
      loop(Socket); 
     {tcp_close,Socket}-> 
      % ... 
end. 

Mon OS est Windows. Lorsque la taille du message est de 1024 octets, je perds des octets dans Data. Le serveur envoie ACK + FIN au client. Je crois que l'Erlang est limité à 1024 octets, donc j'ai défini recbuf.

Où le problème est: Erlang, Windows, matériel?

Merci.

+0

Vraiment aucune idée du problème? – Bertaud

+0

Je ne suis pas un Erlang, donc je ne peux pas vraiment comprendre ce que vous faites. Quel est exactement le problème? –

Répondre

2

Il est possible que le tampon de réception soit trop petit. Erlang n'est certainement pas limité à un tampon de 1024 octets. Vous pouvez vérifier vous-même en procédant comme suit dans la coquille:

{ok, S} = gen_tcp:connect("www.google.com", 80, [{active,false}]), 
O = inet:getopts(S, [recbuf]), 
gen_tcp:close(S), 
O. 

Sous Mac OS X, je reçois un défaut de recevoir la taille de la mémoire tampon d'environ 512 Ko.


Avec {packet, 0} analyse syntaxique, vous recevrez les données tcp quelle que soit la pile de morceaux réseau choisit de l'envoyer, donc vous devez faire l'analyse syntaxique des limites de message et vous en mémoire tampon. Avez-vous un moyen fiable de vérifier les limites des messages dans le protocole fil? Si oui, recevez les données TCP et ajoutez-les à une variable tampon jusqu'à ce que vous ayez un message complet. Puis appelez handle sur le message complet et supprimez le message complet de la mémoire tampon avant de continuer.

Nous pourrions probablement vous aider davantage si vous nous avez donné des informations sur le client et le protocole utilisé.

+0

merci pour cette explication. malheureusement je n'ai aucune information (j'essaie la méthode inverse engeenering). le client envoie un ou plusieurs messages séparés par . le problème est le "plusieurs"! par conséquent, je n'ai aucun critère pour terminer le tampon. – Bertaud

+1

Vous avez donc un marqueur de limite de message de '\ r \ n'? Si c'est le cas, alors Erlang a intégré la solution - utilisez '{paquet, ligne}' dans les options d'écoute pour qu'Erlang mette en mémoire tampon des lignes entières pour vous. Traitez ensuite autant de messages de ligne que vous le souhaitez, ou traitez jusqu'à ce que vous obteniez un message de fermeture de socket. – archaelus

Questions connexes