SocketLinker.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Configuration;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Net.Sockets;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace SocketToolbox
  10. {
  11. class SocketLinker
  12. {
  13. public static SocketLinker ins = null;
  14. public static SocketHandler CurrentHandler = null;
  15. private Socket listener;
  16. private int listen_port = 9000;
  17. public SocketLinker()
  18. {
  19. this.Start();
  20. }
  21. public void Start()
  22. {
  23. // Create a TCP/IP socket.
  24. listener = new Socket(AddressFamily.InterNetwork,
  25. SocketType.Stream, ProtocolType.Tcp);
  26. IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("192.168.111.254"), listen_port);
  27. // Bind the socket to the local endpoint and listen for incoming connections.
  28. listener.Bind(localEndPoint);
  29. listener.Listen(20);
  30. // Start an asynchronous socket to listen for connections.
  31. Console.WriteLine("Waiting for a connection...");
  32. listener.BeginAccept(
  33. new AsyncCallback(AcceptCallback),
  34. listener);
  35. }
  36. public void AcceptCallback(IAsyncResult ar)
  37. {
  38. try
  39. {
  40. // Get the socket that handles the client request.
  41. Socket listener = (Socket)ar.AsyncState;
  42. listener.BeginAccept(
  43. new AsyncCallback(AcceptCallback),
  44. listener);
  45. Socket conn = listener.EndAccept(ar);
  46. IPEndPoint remoteIPE = (IPEndPoint)(conn.RemoteEndPoint);
  47. // Create the state object.
  48. SocketHandler handler = new SocketHandler(0, new IPEndPoint(remoteIPE.Address, 7));
  49. handler.connection = conn;
  50. handler.StartReceive();
  51. CurrentHandler = handler;
  52. }
  53. catch (Exception e)
  54. {
  55. Console.WriteLine(e.ToString());
  56. }
  57. }
  58. }
  59. class SocketHandler
  60. {
  61. //laser id
  62. public int id { get; set; }
  63. public bool writeAvailable { get; set; }
  64. public bool linkAvailable { get; set; }
  65. //remote ipe
  66. private EndPoint remotePE { get; set; }
  67. // Client socket.
  68. public Socket remote { get; set; }
  69. public Socket connection { get; set; }
  70. // Size of receive buffer.
  71. private const int BufferSize = 512;
  72. // remote receive buffer
  73. private byte[] sendBuffer = new byte[BufferSize];
  74. // connection receive buffer
  75. public byte[] receiveBuffer = new byte[BufferSize];
  76. public SocketHandler(int id, EndPoint pe)
  77. {
  78. this.id = id;
  79. remotePE = pe;
  80. }
  81. public void StartReceive()
  82. {
  83. try
  84. {
  85. Receive();
  86. remote = new Socket(remotePE.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
  87. // Connect to the remote endpoint.
  88. remote.BeginConnect(remotePE, new AsyncCallback(ConnectCallback), null);
  89. }
  90. catch (Exception e)
  91. {
  92. Console.WriteLine(e.ToString());
  93. this.Close();
  94. }
  95. }
  96. public void StartSend()
  97. {
  98. try
  99. {
  100. remote = new Socket(remotePE.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
  101. // Connect to the remote endpoint.
  102. remote.BeginConnect(remotePE, new AsyncCallback(ConnectCallback), null);
  103. }
  104. catch (Exception e)
  105. {
  106. Console.WriteLine(e.ToString());
  107. this.Close();
  108. }
  109. }
  110. public void Close()
  111. {
  112. if (connection != null)
  113. {
  114. connection.Close();
  115. }
  116. if (remote != null)
  117. {
  118. remote.Close();
  119. }
  120. }
  121. private void ConnectCallback(IAsyncResult ar)
  122. {
  123. try
  124. {
  125. // Complete the connection.
  126. remote.EndConnect(ar);
  127. Console.WriteLine("Socket connected to {0}", remote.RemoteEndPoint.ToString());
  128. writeAvailable = true;
  129. }
  130. catch (Exception e)
  131. {
  132. Console.WriteLine(e.ToString());
  133. this.Close();
  134. writeAvailable = false;
  135. }
  136. }
  137. private void Receive()
  138. {
  139. try
  140. {
  141. connection.BeginReceive(receiveBuffer, 0, BufferSize, 0, new AsyncCallback(ReceiveCallback), null);
  142. }
  143. catch (Exception e)
  144. {
  145. Console.WriteLine(e.ToString());
  146. this.Close();
  147. linkAvailable = false;
  148. }
  149. }
  150. private void Send()
  151. {
  152. receiveBuffer.CopyTo(sendBuffer, 0);
  153. if (writeAvailable)
  154. {
  155. try
  156. {
  157. remote.BeginSend(sendBuffer, 0, sendBuffer.Length, 0, new AsyncCallback(SendCallback), null);
  158. }
  159. catch (Exception e)
  160. {
  161. Console.WriteLine(e.ToString());
  162. this.Close();
  163. writeAvailable = false;
  164. }
  165. }
  166. }
  167. public void Send(byte[] bs)
  168. {
  169. bs.CopyTo(sendBuffer, 0);
  170. if (writeAvailable)
  171. {
  172. try
  173. {
  174. remote.BeginSend(sendBuffer, 0, sendBuffer.Length, 0, new AsyncCallback(SendCallback), null);
  175. }
  176. catch (Exception e)
  177. {
  178. Console.WriteLine(e.ToString());
  179. this.Close();
  180. writeAvailable = false;
  181. }
  182. }
  183. }
  184. private void ReceiveCallback(IAsyncResult ar)
  185. {
  186. try
  187. {
  188. int bytesRead = connection.EndReceive(ar);
  189. //获得信息则再次监听
  190. if (bytesRead > 0)
  191. {
  192. //Send();
  193. connection.BeginReceive(receiveBuffer, 0, BufferSize, 0, new AsyncCallback(ReceiveCallback), null);
  194. }
  195. else
  196. {
  197. this.Close();
  198. }
  199. }
  200. catch (Exception e)
  201. {
  202. Console.WriteLine("掉线\n" + e.ToString());
  203. this.Close();
  204. linkAvailable = false;
  205. }
  206. }
  207. private void SendCallback(IAsyncResult ar)
  208. {
  209. try
  210. {
  211. remote.EndSend(ar);
  212. }
  213. catch (Exception e)
  214. {
  215. Console.WriteLine(e.ToString());
  216. this.Close();
  217. writeAvailable = false;
  218. }
  219. }
  220. }
  221. }