2011-07-18 10 views
1

いいえ、うまくいけば簡単な質問&答え。 私のアプリケーションは、特定のshowcontrolサーバーのUDPポートと任意のIPアドレスでリッスンすることになっています。単純なASCIIテキスト/文字列を送信するだけです。C#UDPリスナーは、別のプログラムが何かを送信するまでパケットを受け付けません。

オフィスにこのようなS.C.サーバーがないので、UDPパケットだけをブロードキャストする非常に小さな単純なコンソールアプリケーションも作成しました。

これは、コンソールアプリケーションです:私は、リスナー部に二つのことを試してみた

static void Main(string[] args) 
    { 

     Thread.Sleep(1000); 

     Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
     IPEndPoint e = new IPEndPoint(IPAddress.Broadcast, 35000); 

     IPAddress broadcast = IPAddress.Parse("192.168.1.255"); 

     e = new IPEndPoint(broadcast, 35000); 

     string s; 
     Byte[] sendBytes; 

     while ("exit" != (s = Console.ReadLine())) 
     { 
      sendBytes = Encoding.ASCII.GetBytes((s.EndsWith("\n") ? s : s + "\n")); 
      soc.SendTo(sendBytes, e); 
     } 

     sendBytes = Encoding.ASCII.GetBytes("EXIT\n"); 
     soc.SendTo(sendBytes, e); 

     soc.Close(); 
    } 

。 UdpClientを使用してソケット接続を使用して、両方のは、私が私のリスナーコードの両方の下に説明しますとまったく同じ問題与えている:

をソケットバージョン:

public MediaPlayer(Output outputWindow) 
    { 
     Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

     IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, i_inPort); 

     serverSocket.Bind(ipEndPoint); 

     IPEndPoint ipeSender = new IPEndPoint(IPAddress.Any, 0); 

     EndPoint epSender = (EndPoint)ipeSender; 

     SocketState state = new SocketState(); 
     state.e = epSender; 
     state.s = serverSocket; 

     beginReceiveFrom(state); 
    } 
    public void beginReceiveFrom(SocketState state) 
    { 
     state.byteData = new byte[state.byteData.Length]; 
     IPEndPoint ipeSender = new IPEndPoint(IPAddress.Any, 0); 
     state.e = (EndPoint)ipeSender; 

     state.s.BeginReceiveFrom(state.byteData, 0, state.byteData.Length, SocketFlags.None, ref state.e, onReceiveFrom, state); 
    } 

    public void onReceiveFrom(IAsyncResult ar) 
    { 
     SocketState state = (SocketState)ar.AsyncState; 
     Socket serverSocket = state.s; 
     //EndPoint epSender = state.e; 

     IPEndPoint ipeSender = new IPEndPoint(IPAddress.Any, 0); 
     EndPoint epSender = (EndPoint)ipeSender; 
     try 
     { 
      serverSocket.EndReceiveFrom(ar, ref epSender); 

      string s = Encoding.ASCII.GetString(state.byteData); 
     } 
     catch (System.Exception ex) 
     { 
      Console.WriteLine(ex); 
     } 
     finally 
     { 
      beginReceiveFrom(state); 
     } 
    } 

をUdpClientバージョン:

public MediaPlayer(Output outputWindow) 
    { 
     UdpClient client = new UdpClient(i_inPort); 
     IPEndPoint endPoint = null; 

     UdpState state = new UdpState(); 

     state.e = endPoint; 
     state.u = client; 
    } 

    private void BeginReceive(UdpState state) 
    { 
     state.u.BeginReceive(new AsyncCallback(ReceiveCallback), state); 
    } 

    private void ReceiveCallback(IAsyncResult ar) 
    { 
     UdpState state = null; 

     try 
     { 
      state = (UdpState)ar.AsyncState; 

      Byte[] receiveBytes = state.u.EndReceive(ar, ref state.e); 
      string receiveString = Encoding.ASCII.GetString(receiveBytes); 

      executive.Receive(receiveString); 

      BeginReceive(state); 
     } 
     catch(System.Exception ex) 
     { 
      SetText(ex.ToString()); 
     }  
    } 

UpdClient ReceiveCallbackバージョンには、最初に使用したコードがあるため、いくつかのコードがあります。 問題は、とにかく私の会社のネットワークとどんなコンピュータでも、問題なく動作しているコンソールアプリケーションを使って、私が送っている/放送しているときです。任意の量のコンピュータで複数のメディアプレイヤーを問題なく再生できます。

しかし、別のUDP送信者(hw-group.comのHerculesのようなもの)を使用している場合は、単に動作しません> <私はコンソールアプリケーションで1つのコマンドを送信します。それだけで、私のapplcationはherculesアプリケーションからのデータを受け入れますが、私のコンソールアプリケーションでテキスト/パケット/データを送信した後です。

私が間違っていることを見ている人はいますか?私はここからcodeprojectとguru-somethingという複数のコード例を読みましたが、それらはすべて私が使用したのと同じタイプのプログラミングを使用しています。

また、テキストの壁には申し訳ありません。

答えて

0

あなたがデバイスに送信しているメッセージには存在しないパケットのヘッダーがある可能性がありますので、それを再度確認し、メッセージが正しくデコードされていることを確認してください。

関連する問題