我在这个问题上提供了很多信息,因为我不知道什么是相关的
问题:
我正在处理我正在处理的程序的问题,在运行它时,它会冻结我的整个计算机并且不会返回任何错误(我完全无法做任何事情CTRL + ALT + DEL甚至不起作用)。此程序接受来自Android客户端的连接,并且atm未正确配置android客户端,因此连接被拒绝。
问题:
如何阻止我的程序冻结我的整个机器?
猜想:
我有一些关于发生了什么的理论,但不知道如何修复它们。我已经读过这可能与我在异步工作程序中运行单线程进程有关,但我不确定套接字是单线程进程。此外,我不完全确定我应该如何处理后台工作程序中的异常,所以我只是让它回退到RunWorkerCompletedEventArgs然后从那里检索错误消息。
我尝试了什么:
- 我尝试在每个地方放置尝试捕获然后删除尝试捕获似乎没有能够捕获此错误
- 我检查了我的系统事件日志,除了我的计算机冻结后重新启动以外没有任何显示
- 我试图找出这个问题,但它可以从程序开始到我尝试连接的任何时候发生
设定:
我在windows 8 pro机器上运行visual studio 2012 professional的程序。我所用的电脑有一个3.57GHz的i7-3770K和32GB的内存。尝试与我的连接的应用程序是Android应用程序,并且在尝试连接时凭据不正确。 Visual Studio正在运行我的主硬盘驱动器并在另一个驱动器上构建项目。
闭合:
尽管如此,有人愿意帮助我吗?如果您需要更多信息,我很乐意提供,请询问。
主要方法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
namespace Server
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class SourceServer : Window
{
private BackgroundWorker worker = new BackgroundWorker();
public SourceServer()
{
InitializeComponent();
StartListeningForConnections();
}
private void StartListeningForConnections()
{
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
worker.WorkerReportsProgress = true;
if (worker.IsBusy != true)
{
worker.RunWorkerAsync();
}
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
worker.ReportProgress(0, "Source server version 0.0.0.1ib started");
LoginServer oLoginServer = new LoginServer();
oLoginServer.StartListening(worker);
}
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
try
{
lvOutput.Items.Add(e.UserState.ToString());
}
catch (Exception exception)
{
lvOutput.Items.Add(exception.StackTrace);
}
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
System.IO.File.WriteAllText(Environment.CurrentDirectory + @"\log.txt", e.Error.StackTrace + " /n " + e.Error.Message);
}
else
{
MessageBox.Show("Error was null");
}
worker.Dispose();
}
}
}
SSL套接字连接:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Windows;
using System.Windows.Controls;
using System.ComponentModel;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using MySql.Data.MySqlClient;
using System.IO;
namespace Server
{
public class LoginServer
{
// Incoming data from the client.
public static string data = null;
public static X509Certificate serverCertificate = null;
public delegate void UpdateListView(ListView oOutput);
public void StartListening(BackgroundWorker worker)
{
// Data buffer for incoming data.
byte[] bytes = new Byte[1024];
// Establish the local endpoint for the socket.
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[1];
serverCertificate = X509Certificate.CreateFromCertFile(@"server.crt");
TcpListener oServer = new TcpListener(ipAddress, 12345);
// Bind the socket to the local endpoint and
// listen for incoming connections.
// Start listening for connections.
while (true)
{
Thread.Sleep(100);
worker.ReportProgress(0, "Waiting for connection....");
// Program is suspended while waiting for an incoming connection.
//Socket handler = listener.Accept();
oServer.Start();
TcpClient oClient = oServer.AcceptTcpClient();
Stream oStream = oClient.GetStream();
SslStream oSSLStream = new SslStream(oStream);
data = null;
// An incoming connection needs to be processed.
string sUsername = "place holder";
string sPassword = "place holder";
while (true)
{
bytes = new byte[1024];
int bytesRec = oSSLStream.Read(bytes, 0, bytes.Length);
data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
string[] sCredentials = data.Split("|".ToCharArray()[0]);
sUsername = sCredentials[0];
sPassword = sCredentials[1];
if (data.IndexOf("<EOF>") > -1)
{
break;
}
}
// Show the data on the console.
worker.ReportProgress(0, "Connection Recieved : ");
worker.ReportProgress(0, "Username: " + sUsername);
worker.ReportProgress(0, "Password: " + sPassword);
worker.ReportProgress(0, "");
// Echo the data back to the client.
byte[] msg;
if (sUsername.Equals("test") && sPassword.Equals("test"))
{
msg = Encoding.ASCII.GetBytes("approved<EOF>\n");
worker.ReportProgress(0, "approved");
oSSLStream.Write(msg, 0, msg.Length);
}
else
{
msg = Encoding.ASCII.GetBytes("rejected<EOF>\n");
worker.ReportProgress(0, "rejected");
oSSLStream.Write(msg, 0, msg.Length);
}
}
}
public void VerifyUser()
{
}
}
}
答案 0 :(得分:2)
虽然我认为没有任何理由可以锁定整台计算机,但我确实看到了应用程序潜在挂起的几个原因......
除非您的客户端将
'<EOF>'写入流,否则您的SSL服务器内部的while循环将永远不会中断;你必须强迫它去做。我可能会做类似的事情:
while(( bytesRec = oSSLStream.Read(bytes,0,bytes.Length)) > 0 )
{
// Compare input & break
}
- 你现在拥有的while循环(没有线程休眠)将消耗所有等待的系统资源......可能永远不会发生的事情。
在相关问题中 - 我注意到您的'DoWork'方法启动了侦听器 - 但是没有为此侦听器启动新线程。这意味着侦听器在您的接口线程内运行 - 这将导致接口(可能更多......)挂起,直到该过程完成 - 如上所述,可能永远不会发生。
...咳咳......这最后一段可能不正确 - 您正在运行异步工作者,所以在第二次评估中我可能不正确。
干杯,希望这有帮助。
答案 1 :(得分:0)
我在Windows 8上遇到过一些我从未在Windows 7上看到过的问题(使用VS2012)。正如你所经历的那样,它第一次工作正常,但只锁定了Visual Studio(而不是我的整个机器),我不得不强制退出。
Visual Studio 2012 Update 4(专注于错误修复和兼容性)似乎解决了这个问题,虽然我没有科学地测试它。
注意:从9/1/13开始,这只是RC2版本所以请检查更新版本,并在RTM发生时编辑此答案。