Kan en tcp socket i Erlang "overbelastes"?
Hej,
Jeg bruger Erlang til mit master projekt, hvor jeg bl.a. skal implementere et distribueret system. Erlang er fantastisk til dét og en fornøjelse at arbejde med. Men! Jeg er stødt ind i en mærkelig fejl mht. sockets. (Eller måske anvender jeg sockets forkert?)
Det drejer sig om gen_tcp:send/2, hvor jeg med meget kort mellemrum sender små binære pakker over socket'en. De binære pakker er Erlang terms som er marshalled' via term_to_binary/1. Problemet er, at nogle gange modtager jeg kun nogle af pakkerne i den anden ende på trods af at gen_tcp:send/2 returnerer 'ok' for alle pakkerne. Jeg har forsøgt alskens properties for sockets'ne bl.a. 'nodelay', {sndbuf, 0}, {recbuf, 0} mv. men det eneste som virker er hvis jeg imellem hver gen_tcp:send/2 sleep'er 1 msec (timer:sleep/1).
Fejlen opstår på både Windows XP og Linux og både over netværk og på localhost.
Jeg ved at gen_tcp:send/2 returnerer ok selvom forbindelsen i den anden ende er lukket, men det har jeg kontrolleret og det er den ikke.
Kan socket'en blive overbelastet? Ikke at jeg nogensinde har hørt om det.
Hvad gør jeg galt?
Er der nogen der kan hjælpe?
Har du prøvet at sniffe på netværket for at konstatere om pakken bliver sendt?
Man kan vist ikke sniffe pakker på loopback interfacet i Windows og jeg har ikke rettighederne på linux maskinerne. Ellers et godt forslag.
Jeg fandt ud af det. Manglede at sætte 'packet's property'en for sockets'ne. Det får Erlang til at håndtere de applikationsspecifikke logiske pakker korrekt (på trods af fragmentering mv.)
Problemet var netop, at nogle af pakkerne blev fragmenteret og derfor ikke blev korrekt samlet i den anden ende.
