Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не отдает ответTcpClient / 25 сообщений из 42, страница 1 из 2
27.04.2018, 18:48
    #39637696
EnyaS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отдает ответTcpClient
Добрый день, уважаемые форумчане! Помогите, пожалуйста, разобраться, почему 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
27.04.2018, 22:36
    #39637747
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отдает ответTcpClient
не мучайте ..., используйте WCF
при такой реализации можно скормить вашей программе, что угодно. Это ахтунг.
...
Рейтинг: 0 / 0
28.04.2018, 11:18
    #39637924
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отдает ответTcpClient
вот после этого:

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



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

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

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

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

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

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

Возможно Read устанавливает DataAvailable
...
Рейтинг: 0 / 0
28.04.2018, 18:00
    #39638149
EnyaS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отдает ответTcpClient
ViPRos, да, видела эти примеры. Если я правильно понимаю, то и до начала чтения DataAvailable должно быть true, ведь чтение еще не начато.
Изначально проверку на DataAvaileble вообще не делала, объявляла массив размером dev.ReceiveBufferSize - результата нет.
...
Рейтинг: 0 / 0
28.04.2018, 18:00
    #39638150
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отдает ответTcpClient
Код: 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
28.04.2018, 18:05
    #39638151
EnyaS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отдает ответTcpClient
Konst_One, вот на этом месте вываливается и DataAvailable false всегда:
Код: plaintext
1.
int numberOfBytesRead = networkStream.Read(readBuffer, 0, readBuffer.Length);
...
Рейтинг: 0 / 0
28.04.2018, 18:21
    #39638154
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отдает ответTcpClient
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
28.04.2018, 18:47
    #39638168
EnyaS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отдает ответTcpClient
ViPRos,
Exeption выдает. Код 5, текст дословно не помню, примерно: сервер не ответил в течение какого-то времени.
...
Рейтинг: 0 / 0
28.04.2018, 18:52
    #39638170
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отдает ответTcpClient
EnyaS,

ну, надо с этим разбираться тогда, поиграться с таймаутом и т.д.
...
Рейтинг: 0 / 0
28.04.2018, 18:55
    #39638172
EnyaS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отдает ответTcpClient
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
28.04.2018, 18:58
    #39638176
EnyaS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отдает ответTcpClient
ViPRos,
Да уже по всякому я этот таймаут вертела: добавдяла, убавляла, ничего не помогает.
В примере на java вообще нет каких-либо таймаутов, запос и сразу чтение - и есть ответ.
...
Рейтинг: 0 / 0
28.04.2018, 18:59
    #39638177
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отдает ответTcpClient
EnyaS,

ну, тут мне сложно сказать, почему сервер не отвечает или что там еще мешает - не специалист
...
Рейтинг: 0 / 0
28.04.2018, 19:03
    #39638179
EnyaS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отдает ответTcpClient
ViPRos,
Спасибо, что не остались равнодушны. Возможно, кто-то еще увидит тему и подскажет)
...
Рейтинг: 0 / 0
28.04.2018, 19:44
    #39638195
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отдает ответTcpClient
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
03.05.2018, 10:57
    #39639233
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отдает ответTcpClient
EnyaSк сожалению, с WCF никогда не сталкивалась.
Так столкнитесь, что бы не изобретать велосипедов
...
Рейтинг: 0 / 0
07.05.2018, 11:30
    #39641287
EnyaS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отдает ответTcpClient
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
07.05.2018, 11:35
    #39641292
EnyaS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отдает ответTcpClient
Cat2,
столкнулась, почитала статьи и msdn, посмотрела примеры. Если я правильно поняла, то приложение мое должно работать со службой, которая в свою очередь будет работать с устройством. Вопрос остался тот же, как служба получит ответ от сервера (устройства), если сейчас у меня именно это и не получается?
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не отдает ответTcpClient / 25 сообщений из 42, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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