// 连接到指定节点 void HandleConnected(IAsyncResult ar) { if (!running) { return; } AsyncConnectArgs args = ar.AsyncState as AsyncConnectArgs; Socket client = args.c; try { client.EndConnect(ar); NetConnection nc = new NetConnection(client); lock (connections) connections.Add(nc); nc.OnDisconnected += HandleDisconnected; args.nc = nc; args.reason = null; } catch (Exception ex) { args.nc = null; args.reason = ex.Message; } args.done = true; }
// 异步连接到指定网络节点 public void Connect2Peer(string addr, int port, Action <NetConnection, string> callback, AddressFamily addrFamily = AddressFamily.InterNetwork) { running = true; Socket client = new Socket(addrFamily, SocketType.Stream, ProtocolType.Tcp); client.Blocking = true; AsyncConnectArgs args = new AsyncConnectArgs(); args.c = client; args.cb = callback; lock (connecting) connecting.Add(args); IPAddress[] ips = Dns.GetHostAddresses(addr); if (ips.Length == 0) { client.Close(); return; } client.BeginConnect(ips[0], port, HandleConnected, args); }