2014-04-02 8 views
3

UdpClient 클래스를 사용 중입니다. .net 3.5 동일한 포트에 여러 애플리케이션을 바인드해야합니다.다중 포트를 동일한 포트에 바인드

서버가 모든 요청을 브로드 캐스트하면 포트에서 수신 대기하는 모든 응용 프로그램이 메시지를받을 수 있지만 문제는 동일한 포트에 응용 프로그램을 바인드하려고하면 하나의 응용 프로그램에서만 메시지를 수신하고 다른 사람은 그렇지 않습니다.

UdpClient udpClient = new UdpClient(); 
    Thread thread; 
    IPEndPoint endPoint = new IPEndPoint(IPAddress.Loopback, 11000); 
    public Form1() 
    { 
     //CheckForIllegalCrossThreadCalls = false; 

     InitializeComponent(); 
     udpClient.ExclusiveAddressUse = false; 
     udpClient.Client.SetSocketOption(
     SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
     udpClient.Client.Bind(endPoint); 
    } 

    private void MainForm_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Escape) 
     { 
      thread.Abort(); 
      udpClient.Close(); 
      Close(); 
     } 
    } 

    private void ReceiveMessage() 
    { 
     //while (true) 
     //{ 
     // IPEndPoint remoteIPEndPoint = new IPEndPoint(IPAddress.Any, 11000); 
     // byte[] content = udpClient.Receive(ref endPoint); 
     udpClient.BeginReceive(new AsyncCallback(Read_Callback), null); 

     //if (content.Length > 0) 
     //{ 
     // string message = Encoding.ASCII.GetString(content); 

     // this.Invoke(myDelegate, new object[] { message }); 
     //} 
     // } 
    } 

    public void Read_Callback(IAsyncResult ar) 
    { 
     try 
     { 
      byte[] buffer = udpClient.EndReceive(ar, ref endPoint); 
      // Process buffer 
      string s = Encoding.ASCII.GetString(buffer); 
      // richTextBox1.Text = s; 
      udpClient.BeginReceive(new AsyncCallback(Read_Callback), null); 

     } 
     catch (Exception ex) 
     { } 
    } 

PS : 아래

는 두 응용 프로그램에 대한 몇 가지 예제 코드 나는 이유를 알아낼 수 없습니까 아니면 내가 뭔가를 놓친 거지. ?

답변

3

그건 소켓의 특성입니다. 여러 응용 프로그램이 동일한 포트에 액세스 할 수있는 경우 (예 : UDP)에도 데이터가 선착순으로 전달됩니다. UDP는 또한 최소한의 오버 헤드로 설계되었으므로, 여러분은 (가상으로) TCP와 같이 할 수있는 것처럼 "대기열을 확인"할 기회조차 없습니다.

여러 프로세스가 서버로드를 공유하도록 설계되었으며 유휴 상태에 따라 요청을받는 사람이 번갈아 나타납니다.

모든 인바운드 메시지가 공유되는지 확인하기 위해 재전송 프로토콜 또는 데이터베이스와 같이이 문제를 해결하기 위해 외부를 구축해야합니다.

변경 사항을 처리 할 수있는 경우 더 똑똑한 방법으로 UDP Multicast이되며 여러 프로그램이 본질적으로 그룹 메시지를 수신하도록 등록됩니다. 이 경우 단일 포트 제한을 포기할 수 있습니다.

+0

감사합니다. 링크가 나를 도와주었습니다 ... –

관련 문제