powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не отдает ответTcpClient
25 сообщений из 42, страница 1 из 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
25 сообщений из 42, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не отдает ответTcpClient
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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