1

ここでわかるように、LAN経由でUDPを使用しようとしていますが、1つのPCで1つのパッケージを別のPCに送信しますが、受信を開始するとプロセスが応答を停止するため、まだリストしている間にパケットを送信できますか. これがスレッドに関係していることは知っていますが、少し助けが必要です。事前に感謝します。

UdpClient client = new UdpClient();

public void SendPacket()
{
    byte[] packet = Encoding.ASCII.GetBytes(DateTime.Now.ToString("HH:mm:ss:ff"));
    client.Send(packet, packet.Length, tbIP.Text, 444);
    dgvSend.Rows.Add(DateTime.Now.ToString("HH:mm:ss:ff"));
}

public void ReceivePacket()
{
    client = new UdpClient(444);
    IPEndPoint server = new IPEndPoint(IPAddress.Any, 0);
    byte[] packet = client.Receive(ref server);
    dgvReceiv.Rows.Add(Encoding.ASCII.GetString(packet), DateTime.Now.ToString("HH:mm:ss:ff"));
}
4

1 に答える 1

1

何かを始めるとすぐに、他の誰かから何かを受け取るために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そのため、接続したいものが拒否される可能性がある時間に大きなギャップが生じます。

于 2012-09-20T20:21:52.590 に答える