我使用this article at msdn作为主要帮助者编写了我的代码
我的代码:
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
}
}
这就是发生的事情,我在BeginAccept设置了一个断点(我认为存在问题),但它正常地执行它。但是,当我尝试步骤“_AllDone.WaitOne()”时 - 服务器崩溃。
如果_allDone无法在win32表单应用程序中使用 - 如何创建项目?
修改
我忘了提到我在Accept()中写了_AllDone.Reset(),但它没有去那里,我在那里设置了一个断点,但它不会去。
private void Accept(IAsyncResult async)
{
_AllDone.Set();
Socket _Accpt = (Socket)async.AsyncState;
Socket _Handler = _Accpt.EndAccept(async);
StateObject _State = new StateObject();
_State.workSocket = _Handler;
_Handler.BeginReceive(_State.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), _State);
}
答案 0 :(得分:1)
因此,如果我做对了,您希望在收到套接字连接后立即重新启动Accept
,而不是等到Accept
完成,这就是您不使用的原因Accept
的同步版本。
所以你说当你将套接字连接到指定的地址和端口时,它不会激活你的Accept方法?因为这就是Accept所做的:它接受一个新的传入连接,等待客户端连接。这可能就是为什么你认为它“崩溃”以及为什么它永远不会在你的Accept方法中达到你的代码。
提示:也许还可以查看Socket.AcceptAsync
编辑:要设置侦听传入连接的异步服务器,您不需要任何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(例如,当您要关闭服务器时)。
答案 1 :(得分:0)
我认为Lucero试图说,应用程序正常工作,你可能会问为什么会这样。
当您使用服务器端套接字应用程序时,您基本上要做的是让服务器liseten到端口并等待连接到达。当连接到达时,你会完成其余的代码。
Lucero所说的是,虽然没有消息到达服务器,但服务器仍在等待,这可能会让你感觉好像它已经冻结了。
您的代码中是否就是这种情况?