Frage

Ich schrieb meinen Code mit dieser Artikel zu Msdn als primäre Helfer

Mein Code:

    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
        }

    }

Dies ist, was passiert, ich bei BeginAccept einen Haltepunkt gesetzt (ich dachte, es ist das Problem), aber es tritt es normally.However, wenn ich versuche, „_AllDone.WaitOne ()“ zum Schritt -. Der Server zum Absturz bringen

Wenn _allDone nicht in einer win32 Form Anwendung verwendet werden - wie mache ich mein Projekt

Bearbeiten

Ich vergaß zu erwähnen, ich schrieb _AllDone.Reset () in accept (), aber es ist noch nicht gehen, habe ich dort einen Haltepunkt, aber es wird nicht gehen.

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

    }
War es hilfreich?

Lösung

Also, wenn ich es richtig, Sie wollen neu starten Accept sobald eine Socket-Verbindung empfangen wird, und nicht warten, bis Accept geschehen ist, und das ist, warum Sie nicht über die Sync-Version von Accept verwenden.

Sie sagen also, dass es nicht Ihre abfeuert Methode Accept, wenn Sie einen Socket an die angegebene Adresse und Port anschließen? Denn das ist, was Accept tut: es nimmt eine neue eingehende Verbindung, zu warten, bis ein Client eine Verbindung. So sein, dass sich vielleicht, warum Sie denken, dass es „abgestürzt“ und warum es nie Code erreicht in Ihrer Methode Accept.

Hinweis: Vielleicht hat auch einen Blick auf Socket.AcceptAsync

Edit: Um einen Asynchron-Server hört auf eingehende Verbindungen einrichten, Sie brauchen kein 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);
}

. Hinweis: Sie werden auch eine Exit-Bedingung müssen, so dass die BeginAccept nicht (zum Beispiel wenn Sie den Server heruntergefahren werden soll) genannt wird

Andere Tipps

Ich denke, dass Lucero versucht, zu sagen, dass die Anwendung der Regel funktioniert, können Sie fragen, wie kommen.

Nun, wenn Sie eine serverseitige Socket-Anwendung verwenden, was Sie im Grunde tun ist, um den Server zu fragen, zu einem Hafen liseten und warten Sie auf die Verbindung zu gelangen. wenn die Verbindung kommt dann tun Sie den Rest des Codes.

Was Lucero wurde sagen will, ist, dass, während keine Meldung an den Server ankommen der Server hält lisetning und warten, was für Sie aussehen könnte, als ob es gefriert ist.

Ist es der Fall in Ihrem Code?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top