2009-08-21 115 views
4

如果我創建使用如何查找分配給UDP客戶端(以.net/C#)的端口號?

var socket = new UdpClient(0,AddressFamily.InterNetwork); 

我如何再找到插座端口的套接字?

我可能很笨拙,但我沒有MSDN/Google的運氣(可能是因爲它在星期五的4:42而太陽正在閃亮)。

背景:

我想要做的就是找到一個開放的端口,然後到另一個進程報告將郵件轉發到我在該端口上。可能有多個客戶端,所以我不想使用固定端口。

謝謝。

回答

11

UdpClient是Socket類的一個包裝,它通過LocalEndPoint屬性公開了它綁定的端點。由於您使用的是UDP/IP客戶端這是一個IPEndPoint具有所需端口屬性:

int port = ((IPEndPoint)socket.Client.LocalEndPoint).Port; 
+0

感謝。星期一早上我會執行這個第一件事。我錯過的是投到IPEndPoint,所以然後intellisense並沒有幫助我。:( – Chasler 2009-08-22 00:04:12

+0

該死的......從來沒有想過...... thanx。:D – Cipi 2011-06-23 12:05:14

+0

不幸的是,至少在.NET 4.0中,系統從不設置UDP套接字的端口字段,並且由於它是一個只讀屬性,你不能手動設置它 – 2014-09-25 18:57:22

0

對於那些(像我)誰需要使用原始套接字,這裏是解決辦法。

目標:

  1. 創造上的任意端口
  2. 一個RAW UDP套接字系統學習選擇哪個端口。

預期:(socket.LocalEndPoint爲IPEndPoint).Port

問題

  • 而DGRAM UDP套接字知道它(socket.LocalEndPoint爲IPEndPoint).Port
  • 一RAW UDP Socket總是返回零

解決方案:

  1. 創建一個普通DGRAM UDP套接字
  2. 綁定套接字
  3. 找出它的端口
  4. 接近正常插座
  5. 創建的RAW UDP套接字

警告:

  • U請修改local IPEndPoint變量以瞭解端口,因爲套接字將始終報告爲零。

代碼:

public Socket CreateBoundRawUdpSocket(ref IPEndPoint local) 
{ 
    if (0 == local.port) 
    { 
     Socket wasted = new Socket(local.AddressFamily, 
            SocketType.Dgram, 
            ProtocolType.Udp); 
     wasted.Bind(local); 
     local.Port = (wasted.LocalEndPoint as IPEndPoint).Port; 
     wasted.Close(); 
    } 
    Socket goal = new Socket(local.AddressFamily, 
          SocketType.Raw, 
          ProtocolType.Udp); 
    goal.Bind(local); 
    return goal; 
}