public fMain() { InitializeComponent(); InitializeEventHandlers(); ExtraInit(); CheckForIllegalCrossThreadCalls = false; KGState = KeiGuiState.Initialized; }
void cmdStartServers_Click(object sender, EventArgs e) { if (_kClient == null || _kTracker == null) { if (CheckServerFields()) { IPAddress ipa; _wasStartedAsPI = KeiGuiOptions.Current.IsPointInsertion; if (KeiGuiOptions.Current.IsPointInsertion || (false && KeiGuiOptions.Current.UsePortMapping)) { // 作为接入点或者启用了 UPnP 的普通用户启动 ipa = IPAddress.Parse(cboPossibleAddresses.Text.Split(' ')[0]); } else { // 作为普通用户启动 ipa = IPAddress.Loopback; } var nTracker = Convert.ToInt32(txtLocalTrackerServerPort.Text); var nKClient = Convert.ToInt32(txtLocalKClientPort.Text); var trackerEndPoint = new IPEndPoint(ipa, nTracker); var kcEndPoint = new IPEndPoint(ipa, nKClient); if (_kTracker == null) { _kTracker = new TrackerServer(trackerEndPoint); } if (_kClient == null) { _kClient = new KClient(_kTracker, kcEndPoint); _kClient.ConnectionListChanged += _kClient_ConnectionListChanged; } //if (!_kTracker.IsBound) //{ // if (!_kTracker.TestBind(trackerEndPoint)) // { // MessageBox.Show("Tracker 服务器端口不可用,请设置一个新的端口。", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); // _kTracker = null; // return; // } //} //txtLocalTrackerServerPort.Enabled = false; //if (!_kClient.IsBound) //{ // if (!_kClient.TestBind(kcEndPoint)) // { // MessageBox.Show("K客户端服务器端口不可用,请设置一个新的端口。", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); // _kClient = null; // return; // } //} //txtLocalKClientPort.Enabled = false; if (KeiGuiOptions.Current.EnableLogging) { _kTracker.Logger = Program.Logger; _kClient.Logger = Program.Logger; } if (KeiGuiOptions.Current.IsPointInsertion) { _kClient.FreeToGo = true; _kTracker.FreeToGo = true; } _kTracker.Listen(); if (KeiGuiOptions.Current.IsPointInsertion) { // 接入点立即启动,普通用户要连接到接入点后才能启动 _kClient.Listen(); } groupBox1.Enabled = false; groupBox2.Enabled = true; txtLocalKClientEndPoint.Text = _kClient.LocalKEndPoint.ToString(); txtLocalTrackerAddress.Text = "http://localhost:" + _kTracker.LocalEndPoint.Port.ToString() + _kTracker.AnnouceUrl.TrimEnd('?'); SetStatusText("服务器已启动"); KGState = KeiGuiState.ServersStarted; } } }
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); } }