0

私はUDPが初めてです。テスト環境を使用して、単一の UDP メッセージを送受信できます。ただし、複数の UDP メッセージを受信する方法を理解しようとしています。UDP パケットを送信するたびに、MyListener サービスが 1 日中受信できるようにしたいと考えています。助けていただければ幸いです。

PS - 以下の回答で述べたように、DoSomethingWithThisText の周りに while(true) を配置すると、デバッグ中に機能します。ただし、MyListener をサービスとして実行しようとすると、Start は while(true) ループを通過しないため、機能しません。

私のリスナーサービスは次のようになります...

public class MyListener
{
    private udpClient udpListener;
    private int udpPort = 51551;

    public void Start()
    {
        udpListener = new UdpClient(udpPort);
        IPEndPoint listenerEndPoint = new IPEndPoint(IPAddress.Any, udpPort);
        Byte[] message = udpListener.Receive(ref listenerEndPoint);

        Console.WriteLine(Encoding.UTF8.GetString(message));
        DoSomethingWithThisText(Encoding.UTF8.GetString(message));
    }
}

私の送信者は次のようになります。

static void Main(string[] args)
{
    IPAddress ipAddress = new IPAddress(new byte[] { 127, 0, 0, 1 });
    int port = 51551;

    //define some variables.

    Console.Read();
    UdpClient client = new UdpClient();
    client.Connect(new System.Net.IPEndPoint(ipAddress, port));
    Byte[] message = Encoding.UTF8.GetBytes(string.Format("var1={0}&var2={1}&var3={2}", new string[] { v1, v2, v3 }));
    client.Send(message, message.Length);
    client.Close();
    Console.WriteLine(string.Format("Sent message");
    Console.Read();
}
4

2 に答える 2

2

while またはその他のループ内から receive を呼び出す必要があります。

于 2011-08-12T15:22:50.153 に答える
1

私はMicrosoftの非同期メソッドを使用することになりました。ここにあります-BeginReceiveEndReceive

Microsoftが提案しているように、私は次のようにStartメソッド内でBeginReceiveを呼び出します。

UdpState s = new UdpState();
s.e = listenerEP;
s.u = udpListener;

udpListener.BeginReceive(new AsyncCallback(ReceiveCallback), s);

ただし、リスナーにメッセージの受信を継続させるために、ReceiveCallback関数内でBeginReceiveAGAINを再帰的に呼び出します。もちろん、これは潜在的なメモリリークですが、回帰テストで問題が発生することはまだありません。

private void ReceiveCallback(IAsyncResult ar)
{
    UdpClient u = (UdpClient)((UdpState)ar.AsyncState).u;
    IPEndPoint e = (IPEndPoint)((UdpState)ar.AsyncState).e;

    UdpState s = new UdpState();
    s.e = e;
    s.u = u;
    udpListener.BeginReceive(new AsyncCallback(ReceiveCallback), s); 

    Byte[] messageBytes = u.EndReceive(ar, ref e);
    string messageString = Encoding.ASCII.GetString(messageBytes);

    DoSomethingWithThisText(messageString);
}
于 2011-08-15T16:02:21.830 に答える