2011-08-12 54 views
0

私はUDPを初めて使用しています。テスト環境を使用して、私は単一のUDPメッセージを送受信できます。しかし、私は複数のUDPメッセージを受信する方法を理解しようとしています。 MyListenerサービスは、送信するたびに、一日中UDPパケットを受信するようにしたいと思います。私はどんな助けにも感謝します。UDPの送信/受信

PS - 私がDoSomethingWithThisTextの周りに(真)を入れておけば、それはデバッグ中に動作します。しかし、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(); 
} 

答えて

1

ここでは、BeginReceiveEndReceiveというMicrosoftの非同期メソッドが使用されました。

マイクロソフトが提案するように、私はこのような私のStartメソッド内BeginReceiveを呼び出す:

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

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

しかし、リスナーがメッセージを受信し続けるために得るために、私は再帰的に、ReceiveCallback関数内AGAIN BeginReceiveを呼び出します。もちろん、これはメモリリークの可能性がありますが、回帰テストではまだ問題が発生しています。

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); 
} 
+1

ここではリソースリークはありません。あなたが 'EndReceive'を呼び出したので、各読み取り操作に関連するすべてのリソースが正しくクリーンアップされます。最近、 'ReadAsync'が望ましいかもしれないことに注意してください。 –

2

あなたはしばらくまたはいくつかの他のループ内から受け取る呼び出す必要があります。

+0

DoSomethingWithThisTextの周りにwhile(true)ループを追加すると、それは役立ちますが、デバッガでのみ機能します。サービスとしてMyListenerを実行しようとすると、サービスは起動時にタイムアウトします。なぜなら、while(true)ループを過ぎることはないからです。 – WEFX

関連する問題