C #: Проблема с сокетом - подключенный сокет отключается через пару секунд - PullRequest
0 голосов
/ 28 августа 2009

Я пытаюсь подключиться к оборудованию через TCP / IP. Я сделал это очень гладко в VB и пытаюсь добиться того же результата в C #.

Код выглядит так:

internal Socket connectSocket(IPEndPoint vIPEndPoint)
    {
        Socket lclSocket = new Socket(vIPEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);


            try
            {
                lclSocket.Connect(vIPEndPoint);
            }
            catch (Exception ex)
            {

            }

        if (lclSocket.Connected)
        {
            string str = receiveResponse(lclSocket);

            if (str.Contains(PFCommonVariables.m_strCommandDelimiter))
            {
                _sockets.Add(vIPEndPoint, lclSocket);
            }
            else
            {
                lclSocket.Disconnect(true);
            }
        }

        lclSocket.ReceiveTimeout = RECEIVE_TIMEOUT;
        lclSocket.SendTimeout = SEND_TIMEOUT;

        return lclSocket;
    }

Как я уже сказал, этот код точно такой же, как код в VB, и там я могу сохранить успешное соединение. Проблема в C # заключается в том, что сразу после вызова socket.Connect, который я делаю в IPEndPoint, свойство Connected показывается как True. Я также проверяю успешную отправку и получение данных через Wireshark. Затем я ставлю точку останова в операторе if (lclSocket.Connected). Когда я впервые прихожу сюда, свойство Connected все еще имеет значение True. Однако, если я подожду здесь 1-2 секунды, ничего не делая, свойство Connected станет false.

Итак, соединение теряется автоматически. Затем, если я оставлю отладчик включенным и буду ждать в очереди, в Wireshark я вижу многочисленные TCP-сообщения Keep-Alive, которые регулярно пересылаются между ПК и оборудованием. Я не судюсь, что это, но они могут помочь диагностировать проблему ...

Ответы [ 2 ]

0 голосов
/ 28 августа 2009

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

http://bytes.com/topic/c-sharp/answers/258127-how-use-socket-connected-property-properly

Похоже, что может быть состояние полуоткрытого, в котором я подозреваю, что нахожусь. Проблема возникает, когда я пытаюсь получить сообщение, отправленное с аппаратного обеспечения. Сообщение действительно приходит, однако мой цикл приема не прерывается из-за другой проблемы. Однако, поскольку аппаратное обеспечение отправило сообщение, я полагаю, что протокол TCP предполагает, что соединение приостановлено, и устанавливает для свойства Connected значение false.

Я предполагаю, что это происходит точно так же в VB, хотя, поскольку моя функция приема там работает правильно, я никогда не наблюдал изменения в Связанном свойстве. Когда socket.Connected имеет значение false, можно по-прежнему отправлять сообщения. Это стоит проверить.

0 голосов
/ 28 августа 2009

Когда вы ставите точку останова в строке lclSocket.Connected, вы подключаетесь к серверу. В этот момент кажется, что сервер отправит вам ответ от подключения на основе вашего следующего кода. Собирается ли ваш сервер отключить вас за то, что вы не ответили на этот ответ в течение достаточного количества времени?

Также для трафика tcp вы можете заглянуть в класс tcpclient.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...