何かを始めるとすぐに、他の誰かから何かを受け取るためにReceive
別のことを始める必要があります。Receive
通常、複数の接続を受け取りたい場合は、非同期 IO を使用します。例えば:
var client = new UdpClient(endPoint);
AsyncCallback callback = null;
callback = ar =>
{
IPEndPoint newIncomingEndPoint = endPoint;
byte[] data = client.EndReceive(ar, ref newIncomingEndPoint);
client.BeginReceive(callback, null);
// TODO: do something with data
};
client.BeginReceive(callback, null);
または、匿名メソッドを使用しないものに慣れている場合 ( http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.beginreceive.aspxから):
public static bool messageReceived = false;
public static void ReceiveCallback(IAsyncResult ar)
{
UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u;
IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e;
Byte[] receiveBytes = u.EndReceive(ar, ref e);
string receiveString = Encoding.ASCII.GetString(receiveBytes);
Console.WriteLine("Received: {0}", receiveString);
messageReceived = true;
}
public static void ReceiveMessages()
{
// Receive a message and write it to the console.
IPEndPoint e = new IPEndPoint(IPAddress.Any, listenPort);
UdpClient u = new UdpClient(e);
UdpState s = new UdpState();
s.e = e;
s.u = u;
Console.WriteLine("listening for messages");
u.BeginReceive(new AsyncCallback(ReceiveCallback), s);
// Do some work while we wait for a message. For this example,
// we'll just sleep
while (!messageReceived)
{
Thread.Sleep(100);
}
}
非同期 IO を使用しない場合、既存の接続を処理している間は別の接続を受け取ることができません。Receive
そのため、接続したいものが拒否される可能性がある時間に大きなギャップが生じます。