【发布时间】:2015-12-02 04:30:18
【问题描述】:
我一直在测试运行 udp 服务器的各种语言/方法,看看哪种语言/方法的性能最高。到目前为止,我已经测试了 .NET、NodeJs 和 Erlang。我发现此代码片段存在问题,丢弃了我发送的 50% 以上的数据包,而 node 和 .net 大约为 4%。场景是我尽快发送1000 20 byte messages 并将递增的数字打印到屏幕上。 Erlang 只得到了大约 400 个。你能建议我做些什么来改善这个结果吗?
-module(udp).
-export([start/0]).
start() ->
spawn(fun() -> server(41235) end).
server(Port) ->
{ok, Socket} = gen_udp:open(Port, [binary, {active, false}]),
io:format("server opened socket:~p~n",[Socket]),
loop(Socket,0).
loop(Socket,N) ->
inet:setopts(Socket, [{active, once}]),
receive
{udp, Socket, Host, Port, Bin} ->
io:format("~p~n",[N]),
loop(Socket,N+1)
end.
如果我完全搞砸了这个 erlang 代码,我不会感到惊讶。我很难理解一些概念。
我的服务器感激地借用了:http://erlycoder.com/83/erlang-udp-socket-usage-example-with-gen
如果您有兴趣,这是我的客户:
namespace LocalUdpClient
{
class Program
{
private static long _sentCount = 1;
private static CustomQueue _queue;
private static bool _continue = true;
static void Main(string[] args)
{
_queue = new CustomQueue();
_queue.ItemRemovedEventHandler += QueueOnItemRemovedEventHandler;
PopulateQueue();
var con = new System.Net.Sockets.UdpClient();
con.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 41235));
while (_continue)
{
byte[] bits = null;
if (_queue.TryDequeue(out bits))
{
con.SendAsync(bits, bits.Length);
Interlocked.Increment(ref _sentCount);
Console.Clear();
Console.Write(Interlocked.Read(ref _sentCount));
}
}
}
private static void QueueOnItemRemovedEventHandler(object sender, EventArgs eventArgs)
{
var queue = sender as CustomQueue;
if (queue.Count <= 0)
{
Task.Run(() => PopulateQueue()).Wait();
}
}
public static void PopulateQueue()
{
Console.ReadLine();
RandomNumberGenerator rand2 = new RNGCryptoServiceProvider();
Parallel.For(0, 1000, p =>
{
if (_queue.Count >= 1000) return;
byte[] bytes = new byte[20];
rand2.GetBytes(bytes);
_queue.Enqueue(bytes);
});
}
public class CustomQueue : ConcurrentQueue<byte[]>
{
public event EventHandler ItemRemovedEventHandler;
new public bool TryDequeue(out byte[] item)
{
var x = base.TryDequeue(out item);
if (ItemRemovedEventHandler != null)
{
ItemRemovedEventHandler(this,new EventArgs());
}
return x;
}
}
}
【问题讨论】:
-
我有你的代码,这行
io:format("~p~n",[N]),似乎永远不会执行。这在 erlang shell 中没有输出。你能告诉我是什么原因吗? -
你给它发了一个数据包吗?该行仅在收到数据包时打印。