Сокеты .NET внезапно перестали работать - PullRequest
2 голосов
/ 26 января 2012

Я написал TCP Socket сервер и клиент несколько месяцев назад в моем текущем проекте, и с тех пор они работают безупречно.Но на сегодняшний день я просто не могу установить соединение между двумя машинами, которые долгое время общались без проблем.

Настройка очень проста: две машины ('A' и 'B')подключен напрямую через кабель Ethernet (между ними нет переключателя).Устройство «А» также подключено к моей домашней сети, что обеспечивает доступ к Интернету.Машина «B» подключена только к «A».Я использую TCP-сервер на «B», а клиент на «A».

Я использую асинхронные функции .NET Socket (BeginAccept и т. Д. На стороне сервера и BeginConnect и т. Д.на стороне клиента).Отладив оба конца, я могу только подтвердить, что серверный конец никогда не получает вызов от клиента.Я не касался кода, и он все еще работает между другими машинами.

Кроме того, между этими двумя машинами нет никаких других проблем с обменом данными.Я использую Input Director для совместного использования одного набора клавиатуры / мыши, и обычные UNC-пути прекрасно подходят для просмотра одной машины с другой.

Я протестировал разные порты и принесвниз брандмауэры с обеих сторон для хорошей меры.Я освободил / обновил соединения с обеих сторон, перезагрузил обе машины и все остальные варианты, которые я могу придумать.

Признаюсь, я не очень разбираюсь в сети, поэтому я очень признателен за несколько советовчто искать дальше, так как у меня сейчас нет идей о том, что проверять дальше.(Я почти уверен, что это должно быть что-то действительно глупое, что я просто упустил из виду.; O)


РЕДАКТИРОВАТЬ (пример кода 'spike')

По запросу я адаптировал образец MicrosoftСокет код и немного его сжал (ниже).Затем я проверил работу сервера и клиентского компьютера на машине «B», которая работала нормально, но на машине «A» произошло то же самое.Клиент не имеет связи с серверной частью.Вот код:

 public static class SocketServer
{
    private class StateObject
    {
        public Socket _workSocket;
        public const int BufferSize = 1024;
        public readonly byte[] _buffer = new byte[BufferSize];
        public readonly StringBuilder _sb = new StringBuilder();
    }

    private static readonly ManualResetEvent _s_allDone = new ManualResetEvent(false);

    public static void StartListening()
    {
        var ipHostInfo = Dns.Resolve(Dns.GetHostName());
        var ipAddress = ipHostInfo.AddressList[0];
        var localEndPoint = new IPEndPoint(ipAddress, 11000);
        var listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            listener.Bind(localEndPoint);
            listener.Listen(100);
            while (true)
            {
                _s_allDone.Reset();
                Console.WriteLine("Waiting for a connection...");
                listener.BeginAccept(acceptCallback, listener);
                _s_allDone.WaitOne();
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
        Console.WriteLine("\nPress ENTER to continue...");
        Console.Read();
    }

    private static void acceptCallback(IAsyncResult ar)
    {
        _s_allDone.Set();
        var listener = (Socket)ar.AsyncState;
        var handler = listener.EndAccept(ar);
        var state = new StateObject {_workSocket = handler};
        handler.BeginReceive(state._buffer, 0, StateObject.BufferSize, 0, readCallback, state);
    }

    private static void readCallback(IAsyncResult ar)
    {
        var state = (StateObject)ar.AsyncState;
        var handler = state._workSocket;
        int bytesRead = handler.EndReceive(ar);

        if (bytesRead <= 0) 
            return;

        state._sb.Append(Encoding.ASCII.GetString(state._buffer, 0, bytesRead));

        var content = state._sb.ToString();
        if (content.IndexOf("<EOF>") > -1)
        {
            Console.WriteLine("Read {0} bytes from socket. \n Data : {1}", content.Length, content);
        }
        else
        {
            handler.BeginReceive(state._buffer, 0, StateObject.BufferSize, 0, readCallback, state);
        }
    }

    public static int Main(String[] args)
    {
        StartListening();
        return 0;
    }
}

public static class SocketClient
{
    private class StateObject
    {
        public Socket _workSocket;
        public const int BufferSize = 256;
        public readonly byte[] _receiveBuffer = new byte[BufferSize];
        public readonly StringBuilder _sb = new StringBuilder();
    }

    private const int RemotePort = 11000;
    private static readonly ManualResetEvent _s_connectDone = new ManualResetEvent(false);
    private static readonly ManualResetEvent _s_sendDone = new ManualResetEvent(false);
    private static readonly ManualResetEvent _s_receiveDone = new ManualResetEvent(false);

    // The response from the remote device.
    private static String _s_response = String.Empty;

    private static void startClient()
    {
        try
        {
            _s_connectDone.WaitOne(2000); // <-- gives server time to boot when on same machine
            var ipHostInfo = Dns.Resolve(Dns.GetHostName());
            var ipAddress = ipHostInfo.AddressList[0];
            var remoteEndPoint = new IPEndPoint(ipAddress, RemotePort);
            var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            client.BeginConnect(remoteEndPoint, connectCallback, client);
            _s_connectDone.WaitOne();
            send(client, "This is a test<EOF>");
            _s_sendDone.WaitOne();
            receive(client);
            _s_receiveDone.WaitOne();
            Console.WriteLine("Response received : {0}", _s_response);
            client.Shutdown(SocketShutdown.Both);
            client.Close();

        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

    private static void connectCallback(IAsyncResult ar)
    {
        try
        {
            var client = (Socket)ar.AsyncState;
            client.EndConnect(ar);
            Console.WriteLine("Socket connected to {0}", client.RemoteEndPoint);
            _s_connectDone.Set();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

    private static void receive(Socket client)
    {
        try
        {
            var state = new StateObject {_workSocket = client};
            client.BeginReceive(state._receiveBuffer, 0, StateObject.BufferSize, 0, receiveCallback, state);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

    private static void receiveCallback(IAsyncResult ar)
    {
        try
        {
            var state = (StateObject)ar.AsyncState;
            var client = state._workSocket;
            var bytesRead = client.EndReceive(ar);

            if (bytesRead > 0)
            {
                state._sb.Append(Encoding.ASCII.GetString(state._receiveBuffer, 0, bytesRead));
                client.BeginReceive(state._receiveBuffer, 0, StateObject.BufferSize, 0, receiveCallback, state);
            }
            else
            {
                if (state._sb.Length > 1)
                {
                    _s_response = state._sb.ToString();
                }
                _s_receiveDone.Set();
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

    private static void send(Socket client, String data)
    {
        var byteData = Encoding.ASCII.GetBytes(data);
        client.BeginSend(byteData, 0, byteData.Length, 0, sendCallback, client);
    }

    private static void sendCallback(IAsyncResult ar)
    {
        try
        {
            var client = (Socket)ar.AsyncState;
            var bytesSent = client.EndSend(ar);
            Console.WriteLine("Sent {0} bytes to server.", bytesSent);
            _s_sendDone.Set();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

    public static int Main()
    {
        startClient();
        return 0;
    }
}
...