Pregunta

Escribí mi código usando este artículo en msdn como una ayudante principal

Mi código:

    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
        }

    }

Esto es lo que sucede, establezco un punto de interrupción en BeginAccept (pensé que hay un problema), pero normalmente lo soluciona. Sin embargo, cuando trato de pasar " _AllDone.WaitOne () " - la falla del servidor.

Si _allDone no se puede usar en una aplicación de formulario win32, ¿cómo puedo hacer mi proyecto?

EDIT

Olvidé mencionar que escribí _AllDone.Reset () en Aceptar (), pero no va allí, establecí un punto de interrupción allí, pero no iré.

    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);

    }
¿Fue útil?

Solución

Entonces, si lo hago bien, quieres reiniciar Aceptar tan pronto como se reciba una conexión de socket, y no esperar hasta que se haga Aceptar , y eso es por qué no usa la versión de sincronización de Aceptar .

¿Entonces está diciendo que no activa su método de aceptación cuando conecta un socket a la dirección y el puerto especificados? Porque eso es lo que Accept hace: acepta una nueva conexión entrante, esperando hasta que un cliente se conecte. Por lo tanto, puede ser por eso que piensas que " Se estrelló " y por qué nunca llega a su código en su método de aceptación.

Sugerencia: quizás también eche un vistazo a Socket.AcceptAsync

Editar: Para configurar un servidor asíncrono que escucha las conexiones entrantes, no necesita ningún 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);
}

Nota: También necesitará una condición de salida, de modo que no se llame a BeginAccept (por ejemplo, cuando desee cerrar el servidor).

Otros consejos

Creo que Lucero está tratando de decir que la aplicación funciona normalmente, puedes preguntar por qué.

Bueno, cuando está utilizando una aplicación de socket del lado del servidor, lo que básicamente hace es pedirle al servidor que se coloque en un puerto y espere a que llegue una conexión. cuando llega la conexión, usted hace el resto del código.

Lo que Lucero estaba diciendo es que, si bien no llega ningún mensaje al servidor, el servidor sigue haciendo ajustes y esperando, lo que podría buscarte como si estuviera congelado.

¿Es el caso en tu código?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top