Состояние сокета меняется с "Подключено" на "Отключено".

У меня два приложения, одно подключается к другому через TCP Socket. У меня возникла проблема, и после долгого устранения неполадок я начал думать, что основная причина связана с отключением Socket, иначе Socket.state меняется на Disconnected.

Причины, по которым я пришел к вышеуказанному выводу, основаны исключительно на чтении кодов и их анализе. Мне нужно доказать, что это так, и поэтому мой вопрос: сталкивались ли вы когда-нибудь с таким типом проблемы, когда сокет на самом деле продолжает отключаться даже после попытки подключиться к ним?

Ниже приведен мой код Connect. У меня есть цикл, который постоянно проверяет состояние самого сокета. Если я обнаруживаю, что состояние «Отключено», я снова вызываю эту функцию Connect (). Каждый раз, когда я вызываю Connect (), я замечаю, что состояние моего сокета снова возвращается к Connected.

Итак, мои вопросы:

 1.  Have you seen this behavior yourself before?
 2.  Do you see any problem in me calling multiple Connect() again and again?
 3.  Is there a way to simulate this type of socket disconnections?  I tried but I can't set the Socket.Connected flag.


public override void Connect()
    {
        try
        {
            sState = Defs.STATE_CONNECTING;

            // send message to UI
            string sMsg = "<Msg SocketStatus=\"" + sState + "\" />";
            HandleMessage(sMsg);

            // Create the socket object
            sSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            string sIP = "";

            // Define the Server address and port
            if (Validate.IsIPAddress(sServer.ToString()))
            {
                sIP = sServer.ToString();
            }
            else
            {
                IPHostEntry iphost = Dns.GetHostEntry(sServer.ToString());
                sIP = iphost.AddressList[0].ToString();
            }

            IPEndPoint epServer = new IPEndPoint(IPAddress.Parse(sIP), 1234);

            // Connect to Server non-Blocking method
            sSock.Blocking = false;
            AsyncCallback onconnect = new AsyncCallback(OnConnect);
            sSock.BeginConnect(epServer, onconnect, sSock);
        }
        catch (Exception ex)
        {
            LogException(new Object[] { ex });
        }
    }

person Fylix    schedule 03.07.2012    source источник
comment
Установка сокетов в неблокирующий режим не требуется, если вы используете асинхронные (Beginxxx) методы. Я не знаю, вызывает ли это странное поведение, если вы это сделаете, но я больше ничего не могу сказать, учитывая код, которым вы поделились.   -  person C.Evenhuis    schedule 04.07.2012
comment
Как проверить, подключена ли розетка? Обратите внимание, что простая проверка свойства Connected не является надежным способом определения состояния сокета (например, он не обнаружит полуоткрытый сокет). stackoverflow.com/questions/515458/   -  person Kongress    schedule 04.07.2012
comment
Kongress, предположил, что это полуоткрытый сокет, и что я проверил свое свойство Connected, исходя из того, что я знаю, он читает состояние последнего установленного сообщения ... не означает ли это, что я должен получить Connected = false вместо true (что я получаю). Я проверяю подключение сокета, помещая if (socket.connected) в функцию OnConnect (IAsyncResult ar), это функция обратного вызова, которую вы видели в основной функции Connect.   -  person Fylix    schedule 04.07.2012