void cmdStartServers_Click(object sender, EventArgs e) { if (CheckServerFields() && _kClient == null && _kTracker == null) { var ipa = IPAddress.Parse(cboPossibleAddresses.Text); int trackerPort, kcPort; trackerPort = Convert.ToInt32(txtTrackerServerPort.Text); kcPort = Convert.ToInt32(txtKClientPort.Text); _kTracker = new TrackerServer(new IPEndPoint(ipa, trackerPort)); _kClient = new KClient(_kTracker, new IPEndPoint(ipa, kcPort)); _kTracker.Logger = this; _kClient.Logger = this; _kTracker.Listen(); _kClient.Listen(); Log("启动完成。本地参数: KClient=" + cboPossibleAddresses.Text + ":" + kcPort.ToString() + ", KTracker=" + cboPossibleAddresses.Text + ":" + trackerPort.ToString()); txtTrackerURL.Text = "http://localhost:" + txtTrackerServerPort.Text + _kTracker.AnnouceUrl.TrimEnd('?'); txtLocalKClientAddrAndPort.Text = cboPossibleAddresses.Text + ":" + txtKClientPort.Text; groupBox1.Enabled = false; groupBox2.Enabled = true; groupBox4.Enabled = true; } else { Log("本地服务器设置错误。"); } }
void cmdConnectToTargetKClient_Click(object sender, EventArgs e) { try { IPEndPoint ipep = KeiUtil.ParseIPEndPoint(cboTargetKClientEndPoint.Text); Thread kcWorkerThread; for (var i = 0; i < 1; i++) { //Thread.Sleep(1500); WaitHandle wh; if (KeiGuiOptions.Current.IsPointInsertion) { wh = _kClient.EnterNetwork(ipep, Convert.ToUInt16(txtLocalKClientPort.Text), out kcWorkerThread); } else { // 普通用户 wh = _kClient.EnterNetwork(ipep, 0, out kcWorkerThread); } Thread thread = new Thread(delegate() { Invoke(new Action(() => { cmdConnectToTargetKClient.Enabled = false; })); TimeSpan passedTime = TimeSpan.Zero; while (kcWorkerThread.IsAlive && !wh.SafeWaitHandle.IsClosed && passedTime < TimeSpan.FromSeconds(3)) { wh.WaitOne(TimeSpan.FromMilliseconds(10)); passedTime += TimeSpan.FromMilliseconds(10); } if (_kClient.ConnectionList.Count > 0) { Invoke(new Action(() => { if (!_kClient.IsActive) { // 普通用户此时启动 // 不过确实,想想,对于普通用户,如果是端口在从 TestBind() 到现在(即,点下“启动”按钮到点下“连接”按钮并成功) // 这段时间内,该K客户端端口被占用了怎么办?这里就会直接异常,线程崩溃了…… _kClient.Listen(); } cmdConnectToTargetKClient.Enabled = false; groupBox2.Enabled = false; KGState = KeiGuiState.Connected; if (!cboTargetKClientEndPoint.Items.Contains(cboTargetKClientEndPoint.Text)) { cboTargetKClientEndPoint.Items.Add(cboTargetKClientEndPoint.Text); } SetStatusText("已经连接到 " + cboTargetKClientEndPoint.Text + ",开始工作 [" + _kClient.ConnectionList.Count.ToString() + "]"); mnuOpForceBroadcast.Enabled = true; ctxForceBroadcast.Enabled = true; })); } else { Invoke(new Action(() => { cmdConnectToTargetKClient.Enabled = true; SetStatusText("未能连接到 " + cboTargetKClientEndPoint.Text); })); } }); thread.IsBackground = true; thread.Start(); } } catch (Exception ex) { Program.Logger.Log(ex.Message); } }