<div dir="ltr"><div><div><div><div><div><div><div><div>This ought to work:<br><br></div>Including my typos:<br><br>Eshell V7.0.3  (abort with ^G)<br>1> {ok, S} = gen_udp:open(0, [inet]).<br>{ok,#Port<0.533>}<br>2> P = S.<br>#Port<0.533><br>3> inet:port(P).<br>{ok,63315}<br>4> {ok, RP} = gen_udp:open(1234, [inet]).<br>{ok,#Port<0.549>}<br>5> flush().<br>ok<br>6> gen_udp:send(P, {127,0,0,1}, 1234, term_to_binary(hello)).<br>ok<br>7> flush().<br>Shell got {udp,#Port<0.549>,<br>               {127,0,0,1},<br>               63315,<br>               [131,100,0,5,104,101,108,108,111]}<br>ok<br>8> Bytes = [131,100,0,5,104,101,108,108,111].<br>[131,100,0,5,104,101,108,108,111]<br>9> binary_to_term(Bytes).<br>** exception error: bad argument<br>     in function  binary_to_term/1<br>        called as binary_to_term([131,100,0,5,104,101,108,108,111])<br>10> binary_to_term(iolist_to_binary(Bytes)).<br>hello<br><br></div>Immediate questions:<br><br></div>* You are not guaranteed message delivery when using UDP. What is your strategy when this happens? Also, beware kernel settings! Usually the UDP buffer at the kernel side is pretty small, so Erlang doesn't even get a chance to run before the kernel throws away packets.<br><br></div>* What is your MTU? Over localhost, it can be pretty big:<br><br></div>OSX, FreeBSD:<br><br>tiefling:turtle jlouis$ ifconfig lo0 | head -n 1<br>lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384<br><br></div>Linux can use a 64 kilobyte MTU on localhost.<br><br></div>But the Ethernet usually has an MTU of 1500 bytes or even lower, so you cannot send an UDP message above that size without it truncating. What is the iolist_size/1 of your Message?<br><br></div>You will need to split your message over several UDP datagrams then. And you will have to handle that the internet may reorder your datagrams, or lose them mid-flight.<br><br><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Aug 21, 2015 at 2:15 PM, Oscar Muñoz Garrigós <span dir="ltr"><<a href="mailto:osmuogar@gmail.com" target="_blank">osmuogar@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div>Hi,<br></div>I am using a server to send some packets. The problem is actually the packets are truncated and my client does not receive the full packet. I created two sockets but only the socket wich receives the packet returns it to the client, if i change it the packet is lost. Could you give me some advice?<br><br></div>Here is the code:<br><div><br><br><br>-behaviour(gen_server).<br>init(_Args)-><br>    ...<br>    {ok,Socket} = gen_udp:open(49900),<br>    {ok, #state{socket=Socket}}.<br><br>handle_info(Info, State)-> <br>    error_logger:info_msg("Received via INFO: ~p~n", [Info]),<br>    {udp, Socket, IP, InPortNo, Packet} = Info,<br>    [{"from",From},{"to",To},{"text",Text}] = parser:read_xml(Packet),<br><br>    write_to_db(Socket, IP, InPortNo, From, To, Text),<br>    {noreply, State}.<br><br>write_to_db(WSocket, WAdress, WMPort, WFrom, WTo, WText)-><br>     ...<br>     ...<br>    Message = analizar_resultados(Respuesta),<br><br>    {ok, SSocket} = gen_udp:open(0,[inet]),<br>    %%ok = gen_udp:send(SSocket, WAdress, WMPort, Message), <-------- This does not works cause the packet is lost<br>    ok = gen_udp:send(WSocket, WAdress, WMPort, Message), <-------- This works but the packet is truncated<br>    gen_udp:close(SSocket),<br>    ok.<br><br><br><br><br><br></div><div>Thank you all for your help.<br></div></div>
<br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature">J.</div>
</div>