Так что, если я правильно понял, вы хотите перезапустить 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 (например, когда вы хотите выключить сервер).