SockUDP.cs
上传用户:lqb116
上传日期:2014-04-04
资源大小:2712k
文件大小:4k
源码类别:

P2P编程

开发平台:

C#

  1. using System;
  2. using System.ComponentModel;
  3. using System.Collections;
  4. using System.Diagnostics;
  5. using System.IO;
  6. using System.Net;
  7. using System.Net.Sockets;
  8. using System.Text;
  9. using System.Threading;
  10. namespace LanMsg.Controls
  11. {
  12. /// <summary>
  13. /// SockUDP 的摘要说明。
  14. /// </summary>
  15. public class SockUDP : System.ComponentModel.Component
  16. {
  17. /// <summary>
  18. /// 必需的设计器变量。
  19. /// </summary>
  20. private System.ComponentModel.Container components = null;
  21. public SockUDP(System.ComponentModel.IContainer container)
  22. {
  23. ///
  24. /// Windows.Forms 类撰写设计器支持所必需的
  25. ///
  26. container.Add(this);
  27. InitializeComponent();
  28. //
  29. // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
  30. //
  31. }
  32. public SockUDP()
  33. {
  34. ///
  35. /// Windows.Forms 类撰写设计器支持所必需的
  36. ///
  37. InitializeComponent();
  38. //
  39. // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
  40. //
  41. }
  42. /// <summary> 
  43. /// 清理所有正在使用的资源。
  44. /// </summary>
  45. protected override void Dispose( bool disposing )
  46. {
  47. if( disposing )
  48. {
  49. if(components != null)
  50. {
  51. components.Dispose();
  52. }
  53. }
  54. base.Dispose( disposing );
  55. }
  56. private int UDP_Server_Port  ;
  57. private System.Threading.Thread  thdUdp;
  58. private IPEndPoint _Server =new IPEndPoint(IPAddress.Any, 0);
  59. public  delegate void DataArrivalEventHandler(byte[] Data  ,IPAddress   Ip  , int  Port  );
  60. public  event DataArrivalEventHandler DataArrival; 
  61. private UdpClient UDP_Server = new UdpClient(); 
  62. //Socket UDP_Server; 
  63. public  delegate void Sock_ErrorEventHandler(string ErrString);
  64. public  event Sock_ErrorEventHandler Sock_Error; 
  65. [Browsable(true), Category("Client"), Description("获得对方IP地址与端口号等信息.")] 
  66. public IPEndPoint Server 
  67. get 
  68. return _Server; 
  69. set 
  70. _Server = value; 
  71. public void Send(System.Net.IPAddress Host, int Port,byte[] Data) 
  72. try 
  73. IPEndPoint server = new IPEndPoint( Host , Port); 
  74. UDP_Server.Send(Data, Data.Length, server); 
  75.                 //UDP_Server.SendTo(Data,server);
  76. catch (Exception e) 
  77. if (Sock_Error!= null)
  78. Sock_Error(e.ToString()); 
  79. public void Listen(int Port) 
  80. try 
  81. UDP_Server_Port = Port; 
  82. UDP_Server = new  UdpClient(Port); 
  83. // UDP_Server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Udp) ; 
  84. thdUdp = new Thread(new ThreadStart(GetUDPData) ); 
  85. thdUdp.Start(); 
  86. catch (Exception e) 
  87. if (Sock_Error!= null)
  88. Sock_Error(e.ToString()); 
  89. private  void GetUDPData() 
  90. while (true) 
  91. try 
  92. byte[] RData= UDP_Server.Receive(ref _Server);
  93. //byte[] RData= null;
  94. // UDP_Server.Receive(RData);
  95. if (DataArrival != null) 
  96. DataArrival(RData, _Server.Address, _Server.Port); 
  97. Thread.Sleep(0); 
  98. catch (Exception e) 
  99.    if (Sock_Error!= null)
  100.                     Sock_Error(e.ToString()); 
  101. public  void CloseSock() 
  102. Thread.Sleep(30); 
  103. try
  104. {
  105. UDP_Server.Close(); 
  106. thdUdp.Abort();
  107. }
  108. catch(Exception e)
  109. {
  110. if (Sock_Error!= null)
  111. Sock_Error(e.ToString()); 
  112. }
  113.  
  114. #region 组件设计器生成的代码
  115. /// <summary>
  116. /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  117. /// 此方法的内容。
  118. /// </summary>
  119. private void InitializeComponent()
  120. {
  121. components = new System.ComponentModel.Container();
  122. }
  123. #endregion
  124. }
  125. }