powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не отдает ответTcpClient
42 сообщений из 42, показаны все 2 страниц
Не отдает ответTcpClient
    #39637696
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, уважаемые форумчане! Помогите, пожалуйста, разобраться, почему TcpClient не дает считать ответ от сервера.

Итак, есть сетевое периферийное устройство (сервер), к которому обращается программа (клиент). Коннект есть, запрос отправляется, а вот при чтении DataAvailable=false, т.е. получить ответ от сервера не получается вообще никак. Понять, получил ли сервер запрос, нельзя, т.к. устройство не ведет лога.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Sub SendAndReceive(bb() as Byte)
        Dim dev As TcpClient
        dev.Connect(ip, port)

        Dim ns As NetworkStream = dev.GetStream()
        Dim readb As Integer = 0
        
        ns.Write(bb, 0, bb.Length - 1)

        Dim r(11) As Byte
        If ns.CanRead Then
            Do While ns.DataAvailable
                readb = ns.Read(r, 0, r.Length - 1)
            Loop
        End If
end Sub



Есть работающий пример работы с этим устройством на java. Сравнила сформированный мной и в примере запрос, они идентичны, но java-пример получает ответ, а моя программа нет. Если нужен код из java, могу приложить часть кода.
Помогите, пожалуйста, всю голову уже сломала, что не так.

Модератор: Тема перенесена из форума "Visual Basic".
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39637747
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не мучайте ..., используйте WCF
при такой реализации можно скормить вашей программе, что угодно. Это ахтунг.
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39637924
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот после этого:

Код: c#
1.
ns.Write(bb, 0, bb.Length - 1)



надо ждать пока данные назад не станет отдавать устройство.
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39637989
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сервер просто не успел отдать ответ, поэтому DataAvailable возвращает False

DataAvailable - это не признак того, что сервер вернул ответ. Это признак того, есть ли в потоке хоть какие-то данные, которые можно вычитать?

Поэтому цикл должен быть таким:

Пока мы сами не определили, что сервер закончил отвечать
Если DataAvailable == false, то задержка + continue

Считать, все, что есть во входящем потоке и интерпретировать данные (включая анализ, закончил ли отвечать сервер)
Конец цикла
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39638134
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One,
Ждала, ставила задержку до чтения ответа 30-60 секунд (как рекомендует производитель), результат тот же, ответа нет
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39638138
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,
к сожалению, с WCF никогда не сталкивалась. Если я правильно поняла, то кусок кода, который взаимодействует с устройством, Вы предлагаете оформить, как службу, а уже из приложения работать с этой службой? А что изменится в части получения ответа от устройства тогда, если коннектиться к нему все равно через сокеты?
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39638140
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,
пробовала так, DataAvailable не становится true
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39638141
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ns.CanRead что у вас всегда False видимо, вы не проверили, значит в этом потоке читать нельзя
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39638144
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EnyaSArm79,
пробовала так, DataAvailable не становится true
Я сам не пробовал, но в доках везде сначала читают, а потом уж проверяют

do
{
int bytes = stream.Read(data, 0, data.Length);
}
while (stream.DataAvailable); // пока данные есть в потоке
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39638146
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One,
CanRead как раз всегда true, сначала это проверяю, а потом уже, что есть данные для чтения
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39638147
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EnyaS,

Возможно Read устанавливает DataAvailable
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39638149
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ViPRos, да, видела эти примеры. Если я правильно понимаю, то и до начала чтения DataAvailable должно быть true, ведь чтение еще не начато.
Изначально проверку на DataAvaileble вообще не делала, объявляла массив размером dev.ReceiveBufferSize - результата нет.
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39638150
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    var readBuffer = new byte[1024];
    using (var memoryStream = new MemoryStream())
    {
        do
        {
            int numberOfBytesRead = networkStream.Read(readBuffer, 0, readBuffer.Length);
            memoryStream.Write(readBuffer, 0, numberOfBytesRead);

            if (!networkStream.DataAvailable)
                System.Threading.Thread.Sleep(50); //sleep need
        }
        while (networkStream.DataAvailable);
       //memoryStream сожержит ответ, здесь делайте что вам нужно с ним
    }



переведите на VB.NET и замените у себя цикл
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39638151
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One, вот на этом месте вываливается и DataAvailable false всегда:
Код: plaintext
1.
int numberOfBytesRead = networkStream.Read(readBuffer, 0, readBuffer.Length);
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39638154
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EnyaS,

А что выдает то?

Вот вес код, тут либо икзепш, либо число байт

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
        public int Available {
            get {
                if (CleanedUp) {
                    throw new ObjectDisposedException(this.GetType().FullName);
                }
 
                int argp = 0;
 
                // This may throw ObjectDisposedException.
                SocketError errorCode = UnsafeNclNativeMethods.OSSOCK.ioctlsocket(
                    m_Handle,
                    IoctlSocketConstants.FIONREAD,
                    ref argp);
 
                GlobalLog.Print("Socket#" + ValidationHelper.HashString(this) + "::Available_get() UnsafeNclNativeMethods.OSSOCK.ioctlsocket returns errorCode:" + errorCode);
 
                //
                // if the native call fails we'll throw a SocketException
                //
                if (errorCode==SocketError.SocketError) {
                    //
                    // update our internal state after this socket error and throw
                    //
                    SocketException socketException = new SocketException();
                    UpdateStatusAfterSocketError(socketException);
                    if(s_LoggingEnabled)Logging.Exception(Logging.Sockets, this, "Available", socketException);
                    throw socketException;
                }
 
                return argp;
            }
}
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39638168
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ViPRos,
Exeption выдает. Код 5, текст дословно не помню, примерно: сервер не ответил в течение какого-то времени.
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39638170
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EnyaS,

ну, надо с этим разбираться тогда, поиграться с таймаутом и т.д.
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39638172
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ViPRos,
Вот, нашла текст ексепшна: a connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39638176
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ViPRos,
Да уже по всякому я этот таймаут вертела: добавдяла, убавляла, ничего не помогает.
В примере на java вообще нет каких-либо таймаутов, запос и сразу чтение - и есть ответ.
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39638177
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EnyaS,

ну, тут мне сложно сказать, почему сервер не отвечает или что там еще мешает - не специалист
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39638179
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ViPRos,
Спасибо, что не остались равнодушны. Возможно, кто-то еще увидит тему и подскажет)
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39638195
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosEnyaSArm79,
пробовала так, DataAvailable не становится true
Я сам не пробовал, но в доках везде сначала читают, а потом уж проверяют

do
{
int bytes = stream.Read(data, 0, data.Length);
}
while (stream.DataAvailable); // пока данные есть в потоке
Так нельзя. Сервер может присылать порциями неравномерно. И вполне вероятно, что посреди передачи флаг примет значение False. Тогда цикл завершится досрочно.


EnyaSViPRos,
Вот, нашла текст ексепшна: a connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
Скорее всего вы что то не то передаете на сервер. Например, в вашем прикладном протоколе концом передачи является завершающая последовательность символов. И сервер ждет, пока вы ему не пришлете.

Покажите рабочий код Java
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39639233
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
EnyaSк сожалению, с WCF никогда не сталкивалась.
Так столкнитесь, что бы не изобретать велосипедов
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39641287
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,
Это код из рабочего примера на java. Между отправкой запроса и получением ответа пауз нет.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
private SocketChannel socketChannel;
private byte[] sendAndReceive(ByteBuffer bb) throws IOException, ECRException {

        //Match Endianness
        bb.flip();

        socketChannel.write(bb);

        System.out.println("Request sent!");

        ByteBuffer h = ByteBuffer.allocate(11);

        socketChannel.read(h);
        System.out.println("Response received");

        //Match Endianness
        h.flip();

        System.out.println("Protocol version :" + h.get() + "." + h.get());
        System.out.println("S/W version :" + h.get() + "." + h.get() + "." + h.get());

        //get the response code
        int responseCode = h.getShort() & 0xFFFF;


        System.out.println("Response code :" + responseCode + " -  " + ResponseCodes.get(responseCode));

        if (ResponseCodes.get(responseCode) != ResponseCodes.OK) {
            throw new AssertionError(responseCode);
        }

        //Match Endianness
        int len = h.getShort() & 0xFFFF;

        //skip 2 reserved bytes
        h.get();
        h.get();

        ByteBuffer response = ByteBuffer.allocate(len);

        socketChannel.read(response);

        return response.array();
    }
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39641292
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cat2,
столкнулась, почитала статьи и msdn, посмотрела примеры. Если я правильно поняла, то приложение мое должно работать со службой, которая в свою очередь будет работать с устройством. Вопрос остался тот же, как служба получит ответ от сервера (устройства), если сейчас у меня именно это и не получается?
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39641310
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не спец по Java, возможно здесь у вас блокирующее чтение: socketChannel.read(h);
Кроме того, bb.flip - не меняется ли здесь порядок следования байт?
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39641321
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79, я в java вообще не шарю( Спасибо за подсказку, поищу сейчас по справкам, может быть в этом и дело
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39641323
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приложите еще, что там конкретно вы отправляете на сервер. Что за последовательность байт
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39641324
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это не OPC случаем? тогда гуглите про протокол своего устройства
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39641527
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,
Это из java-примера запись в логе (первая строка текст запроса, вторая строка заголовок+закодированный текст запроса).
{"password":"BXiUVPLN"}
d5-80-d4-b4-d5-84-00-05-01-00-00-18-4b-24-29-15-9c-ef-1f-3a-b0-b6-f8-3a-d0-2d-24-60-81-28-51-33-2d-00-41-d3

После bb.flip() последовательность байтов не меняется, остается такая же, как выше (нумерация байтов слева-направо). Прикладываю так же скриншот байтового массива, который отправляется из моей программы.
Для кодирования запросов используется стандартный алгоритм 3DES: ECB режим и PKCS padding
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39641632
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EnyaS{"password":"BXiUVPLN"}
Девушка, к вам в компании так лояльно относятся, что вы спокойно пароли публикуете?
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39641633
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EnyaS{"password":"BXiUVPLN"}
Девушка, к вам в компании так лояльно относятся, что вы спокойно пароли публикуете?
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39641644
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мда :) я не так давно случайно забыл включить авторизацию на своем проекси севрере :) через 5 дней обнаружил, что им уже пол интернета пользуется :D , при том, что не где не публиковал адрес сервера.
(точнее я авторизацию настроил, а ограничения не включил)
а тут совсем палево :) осталось только узнать, от чего пароль
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39641651
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79, это пароль тестового устройства, который был на этом устройстве установлен в момент посылки команды. Пароль меняется нажатием одной кнопки) Более того, это периферийное устройство
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39641652
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79, и да, пароль этот действует только для одной команды, для остальных запросов генерируется сессионный пароль.
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39641666
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EnyaS,

Если у вас сервер имеет выход в и-нет, можете дать ip, попробую проверить
Только убедитесь, что он тестовый ))))
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39641675
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79, попробуйте, конечно) А по теме обсуждения нет идей?
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39641699
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EnyaSArm79, попробуйте, конечно) А по теме обсуждения нет идей?
Как нет. Есть.
Выложите байтовый массив запроса как приложение в виде файла, дайте IP, я проверю и дам код.

По моему, ответ не менялся все это время - 21376831
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39641846
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79, тогда устройство надо настраивать на работу с Вашим ПК, т.к. оно может принимать запросы только с одного ip-адреса, и если я правильно понимаю, то они должны находиться в одной локальной сети.
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39642057
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EnyaS
Код: vbnet
1.
ns.Write(bb, 0, bb.Length - 1)


Возможно, дело в этой строке )))

Из bb.Length не нужно вычитать 1 ни при записи, ни при чтении. 3 параметр - это КОЛИЧЕСТВО байт для отправки, а количество не zero-based

В Java-коде тоже кстати без -1.
...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39642058
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имитация сервера
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
        static void Main(string[] args)
        {
            var server = new TcpListener(Dns.Resolve("localhost").AddressList[1], 9998);
            server.Start();

            Console.WriteLine("Started");

            while (true)
            {
                using (var stream = server.AcceptTcpClient().GetStream())
                {

                    var read = stream.ReadByte();

                    // 11 символов возвращаем
                    var send = Encoding.ASCII.GetBytes($"Received -{read}");

                    stream.Write(send, 0, send.Length);
                    stream.Close();

                    Console.WriteLine($"Отправили: {Encoding.ASCII.GetString(send)}");
                }
            }
        }
    }



Типа ваш клиент
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
        static void Main(string[] args)
        {
            Thread.Sleep(1000);

            do {
                using (TcpClient client = new TcpClient())
                {
                    client.Connect(Dns.Resolve("localhost").AddressList[1], 9998);
                    try
                    {
                        using (var stream = client.GetStream())
                        {
                            stream.WriteByte((byte)new Random().Next(10));

                            using (MemoryStream ms = new MemoryStream())
                            {
                                while (true)
                                {
                                    // выход из цикла
                                    if (ms.Length == 11)
                                        break;

                                    // ждем появления данных
                                    if (false == stream.DataAvailable)
                                    {
                                        Thread.Sleep(10);
                                        continue;
                                    }

                                    // читаем все что есть
                                    var buffer = new byte[11];
                                    var readCount = stream.Read(buffer, 0, buffer.Length);

                                    // записываем, сколько считали (может быть меньше 11)
                                    ms.Write(buffer, 0, readCount);
                                }

                                Console.WriteLine(Encoding.ASCII.GetString(ms.ToArray()));
                            }
                        }

                    }
                    finally
                    {
                        client.Close();
                    }
                } 

            } while (Console.ReadKey().Key == ConsoleKey.Enter);

        }

...
Рейтинг: 0 / 0
Не отдает ответTcpClient
    #39643375
EnyaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79, спасибо Вам огромное, золотой человек! Все это время я искала ошибку не там. Правильно было отправлять запрос так
Код: plaintext
1.
ns.Write(bb, 0, bb.Length)
...
Рейтинг: 0 / 0
42 сообщений из 42, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не отдает ответTcpClient
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]