TCP Socket не отвечает - PullRequest
       6

TCP Socket не отвечает

0 голосов
/ 21 февраля 2012

Я разрабатываю приложение клиент / сервер TCP с использованием программирования сокетов C #. Иногда я сталкиваюсь с очень странной проблемой, поскольку сервер (служба Windows) работает на порту (8089), но он не прослушивает ни одного клиентского запроса, и когда я тестировал порт с помощью сканера портов, он говорил мне, что порт не отвечает! вот мой код сервера:

Во-первых,

private void MainThread () { byte [] bytes = новый байт [1024];

        IPEndPoint localEndPoint = new IPEndPoint(0, this.port);

        Socket listener = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp );

        try {
            listener.Bind(localEndPoint);
            listener.Listen(100);

            while (active) {
                mainDone.Reset();

                listener.BeginAccept(new AsyncCallback(AcceptCallback),listener);

                while (active)
                    if (mainDone.WaitOne(100, true))
                        break;
            }
            listener.Close();

        } catch (Exception e) {
            if (OnError != null)
                OnError(this, e.ToString());
            LogManager.LogError(e, "TCPSimpleServer MainThread"); 
        }

Тогда

 private void AcceptCallback(IAsyncResult ar) {
        Socket handler = null;
        try
        {
            mainDone.Set();

            Socket listener = (Socket)ar.AsyncState;
            handler = listener.EndAccept(ar);

            if (OnConnect != null)
                OnConnect(this, handler);

            StateObject state = new StateObject();

            state.workSocket = handler;
            state.endPoint = (IPEndPoint)handler.RemoteEndPoint;
            stateObjectDictionary.Add(state, state.workSocket);
            handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                new AsyncCallback(ReadCallback), state);
        }
        catch (ObjectDisposedException)
        {
            // Connection closed by client
            if (OnDisconnect != null)
                OnDisconnect(this, (IPEndPoint)handler.RemoteEndPoint);
            return;
        }
        catch (Exception ex)
        {
            LogManager.LogError(ex, "TCPSimpleServer AcceptCallback");
            return;
        }

и, наконец,

private void ReadCallback(IAsyncResult ar) {
        try
        {
            String content = String.Empty;
            StateObject state = (StateObject)ar.AsyncState;
            Socket handler = state.workSocket;

            int bytesRead = 0;
            try
            {
                bytesRead = handler.EndReceive(ar);
            }
            catch (Exception ex)
            {
                // Connection closed by client
                if (OnDisconnect != null)
                    OnDisconnect(this, state.endPoint);
                handler.Close();
                return;
            }

            if (bytesRead > 0)
            {
                string data = Encoding.Default.GetString(state.buffer, 0, bytesRead);

                if (OnDataAvailable != null)
                    OnDataAvailable(this, handler, data);
                try
                {
                    handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                        new AsyncCallback(ReadCallback), state);
                }
                catch (Exception e)
                {
                    if (OnError != null)
                        OnError(this, e.Message);
                    LogManager.LogError(e, "TCPSimpleServer ReadCallback");
                    handler.Close();
                }
            }
            else
            {
                // Connection closed by peer
                if (OnDisconnect != null)
                    OnDisconnect(this, state.endPoint);
            }
        }
        catch (Exception ex)
        {
            LogManager.LogError(ex, "TCPSimpleServer ReadCallback");
        }
    }

Я думаю, что проблема в последнем методе ReadCallback (), если возникла проблема в методе EndReceive (), сокет (обработчик) никогда не освобождает порт. любая помощь, пожалуйста?

1 Ответ

0 голосов
/ 21 февраля 2012

Может ли быть так, что клиент может заблокировать сервер по адресу:

while (active) 
    if (mainDone.WaitOne(100, true)) 
        break; 
...