C#:手动重置事件时崩溃
我使用作为主要助手编写代码 我的代码:C#:手动重置事件时崩溃,c#,multithreading,tcp,manualresetevent,C#,Multithreading,Tcp,Manualresetevent,我使用作为主要助手编写代码 我的代码: private ManualResetEvent _AllDone = new ManualResetEvent(false); internal void Initialize(int port,string IP) { IPEndPoint _Point = new IPEndPoint(IPAddress.Parse(IP), port); Socket _Accpt = new Socket
private ManualResetEvent _AllDone = new ManualResetEvent(false);
internal void Initialize(int port,string IP)
{
IPEndPoint _Point = new IPEndPoint(IPAddress.Parse(IP), port);
Socket _Accpt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_Accpt.Bind(_Point);
_Accpt.Listen(2);
while (true)
{
_AllDone.Reset();
_Accpt.BeginAccept(null, 0, new AsyncCallback(Accept), _Accpt);
_AllDone.WaitOne(); <<crash here
}
}
因此,如果我没有弄错,您希望在收到套接字连接后立即重新启动
Accept
,而不是等到Accept
完成,这就是为什么不使用同步版本的Accept
那么您是说当您将套接字连接到指定的地址和端口时,它不会触发Accept方法?因为Accept就是这样做的:它接受一个新的传入连接,等待客户端连接。因此,这可能就是为什么您认为它“崩溃”了,以及为什么它从未到达您的Accept方法中的代码
提示:也许还可以看看
编辑:要设置异步服务器侦听传入连接,您不需要任何ManualWaitEvent:
internal void Initialize(int port,string IP) {
IPEndPoint _Point = new IPEndPoint(IPAddress.Parse(IP), port);
Socket _Accpt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_Accpt.Bind(_Point);
_Accpt.Listen(2);
_Accpt.BeginAccept(null, 0, new AsyncCallback(Accept), _Accpt);
}
private void Accept(IAsyncResult async) {
Socket _Accpt = (Socket)async.AsyncState;
Socket _Handler;
try {
_Handler = _Accpt.EndAccept(async);
} finally {
_Accpt.BeginAccept(null, 0, new AsyncCallback(Accept), _Accpt);
}
StateObject _State = new StateObject();
_State.workSocket = _Handler;
_Handler.BeginReceive(_State.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), _State);
}
注意:您还需要一个退出条件,以便不调用BeginAccept(例如,当您想关闭服务器时)。我想Lucero是想说,应用程序工作正常,您可能会问为什么 当您使用服务器端套接字应用程序时,基本上要做的是让服务器连接到一个端口,然后等待连接到达。当连接到达时,您将执行其余的代码 Lucero所说的是,当没有消息到达服务器时,服务器会一直保持Liseting状态并等待,这可能会让你看起来像被冻结了一样
您的代码中是否存在这种情况?没有例外,它只是冻结(崩溃)。这是什么类型的“服务器”?一个windows服务,或者只是一个充当服务器的控制台应用程序来进行测试?这是应用程序的服务器部分。你能发布客户端部分吗?我想“崩溃”更像是死锁。你的第一句话是对的——这就是我想要的。但是,您的第二个语句是错误的。我没有使用TCP客户端连接到它。我只是调用该代码来设置服务器。那么,到目前为止,没有任何崩溃。服务器等待传入的客户端连接,并且仅在收到此连接时才会调用您的Accept方法。我想您误解了我的问题。如何使其等待而不崩溃?您写道:“没有例外,它只会冻结(崩溃)”但这正是Accept及其变体应该做的——直到客户端连接!因此,这只是正常的(等待)行为。你误解了我的问题-再一次。服务器是win32表单应用程序。我不能创建一个线程并在线程内执行吗?如果我能做到,请告诉我怎么做。
internal void Initialize(int port,string IP) {
IPEndPoint _Point = new IPEndPoint(IPAddress.Parse(IP), port);
Socket _Accpt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_Accpt.Bind(_Point);
_Accpt.Listen(2);
_Accpt.BeginAccept(null, 0, new AsyncCallback(Accept), _Accpt);
}
private void Accept(IAsyncResult async) {
Socket _Accpt = (Socket)async.AsyncState;
Socket _Handler;
try {
_Handler = _Accpt.EndAccept(async);
} finally {
_Accpt.BeginAccept(null, 0, new AsyncCallback(Accept), _Accpt);
}
StateObject _State = new StateObject();
_State.workSocket = _Handler;
_Handler.BeginReceive(_State.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), _State);
}