LinuxForum.Fans
Тема

QTcpSocket->read()

Автор: Peter 35 сообщений 6800 просмотров
#280580

- т.е. прием идет в нечто типа: char buf[8] ?
- дальше как вы используете: в конструкция типа: if (buf[1]==-1), switch (buf[1]) или у вас нечто типа (buf[1]&&0xf0 << 1)?

#280617
voral написал:
- т.е. прием идет в нечто типа: char buf[8] ?
- дальше как вы используете: в конструкция типа: if (buf[1]==-1), switch (buf[1]) или у вас нечто типа (buf[1]&&0xf0 << 1)?

Там char buf[64]. Дальше просто печатается то, что пришло.

Пётр.

#280621

Последнее, что могу предположить не глядя в исходники. У вас есть в коде что то типа:

text

char othervar[10];
char buf[64];
......
othervar[11] = 1; // или любой другой код приводящий к аналогичному результату
.....
othervar[14] = 1;// или любой другой код приводящий к аналогичному результату
.....
othervar[15] = -1;// или любой другой код приводящий к аналогичному результату
#280622

В общем без исходников врятли кто поможет (я точно пас). Пробуйте выключать/комментировать в вашем проекте все по частям включая объявление/инициализацию переменных. И проверяете не накосяили ли вы с обращением к одному и тому же участку памяти из разных потоков.

#280676
voral написал:
В общем без исходников врятли кто поможет (я точно пас). Пробуйте выключать/комментировать в вашем проекте все по частям включая объявление/инициализацию переменных. И проверяете не накосяили ли вы с обращением к одному и тому же участку памяти из разных потоков.

Это buf объявлен в заголовочном файле, используется он только в подпрограме-слоте
для приёма команды из сокета и больше нигде. TCP-соединение, по которому поступают jpg,
создаётся в потоке, вроде бы не должно ничего портить, но попробую поискать что-нибудь
подозрительное. Вообще программа скомпилирована с debug и Qt сообщает об ошибках,
которые может обнаружить. Или для проверки попробую объявлять этот buf в подпрограмме,
поскольку он больше нигде не нужен.

Пётр.

#281949

Сейчас вернулся к этому и оказалось, что после считывания команды,
посланной сервером по щелчку мыши, клиент каждый раз получает лишние 8 байтов.

При запуске клиента сервер сам посылает ему команду и принимается 8 байтов.
Когда затем следующие команды посылаются по щелчку мыши, от сервера уходит 8 байтов,
а в потоке оказывается 16. Первые 8 - это посланная команда, а следующие 8 - похожие на неё.
Если эти лишние 8 байтов каждый раз тоже считывать, то следующая команда принимается
правильно. Вот выдержка из слота, вызываемого по сигналу readyRead(), sock - это экземпляр
QTcpSocket, создаётся при запуске клиента.

text

char buf[32];
int m1,m2;
....
m1=sock->read(buf,8);m2=sock->read(buf+8,8);

Например, сервер посылает

text
1 3 2 0 5 -1 -1 -1

а принимается

text
1 3 2 0 5 -1 -1 -1 1 1 2 0 5 -1 -1 -1

или сервер посылает

text
1 3 2 0 -1 -1 -1 -1

а принимается

text
1 3 2 0 -1 -1 -1 -1 1 1 2 0 -1 -1 -1 -1

т.е. повторяются первые 8 байтов, но 2-й байт не 3, а 1. Это не символы, а числа.
Т.е. какой-то выход нашёлся, но почему появдяются лишние байты, я не знаю.
---------------------------------------------------------------------------------------------

И ещё одно странное явление - в маленькой программе на Qt в Ubuntu 11.04 успешно
компилируется конструкция, которая в Ubuntu 10.04 компилируется с предупреждением.
Именно, есть объект

text
QByteArray ba;

для него есть функция, возвращающая указатель на начало его данных типа char* :

text
char * data();

в условном операторе среди других есть конструкция

text
(*(ba.data()+n-1)==0xd9)

и в Ubuntu 10.04 на неё выдаётся предупреждение

text
warning: comparison always false due to limited range of data type

Но ведь это данные типа char, однобайтовые, так что не так?

Пётр.

#281959
"Peter" написал:
И ещё одно странное явление - в маленькой программе на Qt в Ubuntu 11.04 успешно
компилируется конструкция, которая в Ubuntu 10.04 компилируется с предупреждением.
Именно, есть объект

Это что то связано с qt (точных объяснений увы не помню). Вроде как с приведением к определенному типу. Варианты решения: попробуйте использовать Qlist<qint8> вместо QByteArray и/или \xd9 вместо 0xd9.

#281961

По первому вопросу. Попробую еще раз ткнуть пальцем в небо.
- проверь сколько раз срабатывает ReadyRead
- проверь снифером какая реально инфа идет и в каком объеме

#281982
voral написал:
[quote="Peter"]И ещё одно странное явление - в маленькой программе на Qt в Ubuntu 11.04 успешно
компилируется конструкция, которая в Ubuntu 10.04 компилируется с предупреждением.
Именно, есть объект

Это что то связано с qt (точных объяснений увы не помню). Вроде как с приведением к определенному типу. Варианты решения: попробуйте использовать Qlist<qint8> вместо QByteArray и/или \xd9 вместо 0xd9.[/quote]
Я тоже думаю, что причина в Qt. в 11.04 установлена 4.7.2, в 10.04 - 4.7.0, обе скомпилированные.

Пётр.

#281984
voral написал:
По первому вопросу. Попробую еще раз ткнуть пальцем в небо.
- проверь сколько раз срабатывает ReadyRead
- проверь снифером какая реально инфа идет и в каком объеме

При таком небольшом количестве данных они должны приниматься с 1-го раза, но проверю.
Я помню, специально экспериментировал в другоq программе с readAll и оказалось, что до 16KB
принимаются с 1-го раза, а если передавать больше, то могут за несколько раз.

Пётр.

#282224
voral написал:
По первому вопросу. Попробую еще раз ткнуть пальцем в небо.
- проверь сколько раз срабатывает ReadyRead
- проверь снифером какая реально инфа идет и в каком объеме

Так она принимается в слоте, соединённом с сигналом readyRead() и за один раз
принимаются эти 16 байтов.

Сегодня в конце дня возникла другая проблема - в этой же программе есть другое
tcp-соединение, оно устанавливается по команде и затем по нему передаются jpg,
так вдруг оно стало само собой закрываться сразу же после открытия - я даю команду,
это внутри клиента, соединение устанавливается и тут же разрывается, по какой причине,
установить пока не удалось. Т.е. сокет соединяется с сервером в другой программе и тут
же рассоедниняется. Ошибка 1, сообщение не помню, но просто что связь разорвана.
С утра и позже работало.

Пётр.

#282242

Проверте еще раз не выходите ли гдето за границы диапазона, или не обращаетесь ли из разных потоков к одной переменной.

#283606
Peter написал:
[quote=voral][quote="Peter"]И ещё одно странное явление - в маленькой программе на Qt в Ubuntu 11.04 успешно
компилируется конструкция, которая в Ubuntu 10.04 компилируется с предупреждением.
Именно, есть объект

Это что то связано с qt (точных объяснений увы не помню). Вроде как с приведением к определенному типу. Варианты решения: попробуйте использовать Qlist<qint8> вместо QByteArray и/или \xd9 вместо 0xd9.[/quote]
Я тоже думаю, что причина в Qt. в 11.04 установлена 4.7.2, в 10.04 - 4.7.0, обе скомпилированные.

Пётр.[/quote]
Сегодня снова столкнулся с этим собщением в Ubuntu 10.10, что always false

text

 char *pcb;
 int n;
....
if( *(pcb+n-1) != 0xd9 )

При выводе

text
fprintf(stdout,"%02X",*(pcb+n-1));

печатается FFFFFFD9, т.е. char рассматривается как int.

Если же написать

text
if( (unsigned char)(*(pcb+n-1)) != 0xd9 )

то это работает как и ожидалось, а вышеприведённый вывод печатает D9.

Пётр.

#283642

Peter, нафига вообще такая конструкция нужна? ведь можно же по-человечески написать pcb[n-1]

#283662
Fat-Zer написал:
Peter, нафига вообще такая конструкция нужна? ведь можно же по-человечески написать pcb[n-1]

Иногда я использую её, иногда []. Они же равнозначны.

Пётр.

Войдите или зарегистрируйтесь, чтобы ответить.