- т.е. прием идет в нечто типа: char buf[8] ?
- дальше как вы используете: в конструкция типа: if (buf[1]==-1), switch (buf[1]) или у вас нечто типа (buf[1]&&0xf0 << 1)?
QTcpSocket->read()
- т.е. прием идет в нечто типа: char buf[8] ?
- дальше как вы используете: в конструкция типа: if (buf[1]==-1), switch (buf[1]) или у вас нечто типа (buf[1]&&0xf0 << 1)?
Там char buf[64]. Дальше просто печатается то, что пришло.
Пётр.
Последнее, что могу предположить не глядя в исходники. У вас есть в коде что то типа:
char othervar[10];
char buf[64];
......
othervar[11] = 1; // или любой другой код приводящий к аналогичному результату
.....
othervar[14] = 1;// или любой другой код приводящий к аналогичному результату
.....
othervar[15] = -1;// или любой другой код приводящий к аналогичному результату
В общем без исходников врятли кто поможет (я точно пас). Пробуйте выключать/комментировать в вашем проекте все по частям включая объявление/инициализацию переменных. И проверяете не накосяили ли вы с обращением к одному и тому же участку памяти из разных потоков.
В общем без исходников врятли кто поможет (я точно пас). Пробуйте выключать/комментировать в вашем проекте все по частям включая объявление/инициализацию переменных. И проверяете не накосяили ли вы с обращением к одному и тому же участку памяти из разных потоков.
Это buf объявлен в заголовочном файле, используется он только в подпрограме-слоте
для приёма команды из сокета и больше нигде. TCP-соединение, по которому поступают jpg,
создаётся в потоке, вроде бы не должно ничего портить, но попробую поискать что-нибудь
подозрительное. Вообще программа скомпилирована с debug и Qt сообщает об ошибках,
которые может обнаружить. Или для проверки попробую объявлять этот buf в подпрограмме,
поскольку он больше нигде не нужен.
Пётр.
Сейчас вернулся к этому и оказалось, что после считывания команды,
посланной сервером по щелчку мыши, клиент каждый раз получает лишние 8 байтов.
При запуске клиента сервер сам посылает ему команду и принимается 8 байтов.
Когда затем следующие команды посылаются по щелчку мыши, от сервера уходит 8 байтов,
а в потоке оказывается 16. Первые 8 - это посланная команда, а следующие 8 - похожие на неё.
Если эти лишние 8 байтов каждый раз тоже считывать, то следующая команда принимается
правильно. Вот выдержка из слота, вызываемого по сигналу readyRead(), sock - это экземпляр
QTcpSocket, создаётся при запуске клиента.
char buf[32];
int m1,m2;
....
m1=sock->read(buf,8);m2=sock->read(buf+8,8);
Например, сервер посылает
1 3 2 0 5 -1 -1 -1а принимается
1 3 2 0 5 -1 -1 -1 1 1 2 0 5 -1 -1 -1или сервер посылает
1 3 2 0 -1 -1 -1 -1а принимается
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 компилируется с предупреждением.
Именно, есть объект
QByteArray ba;для него есть функция, возвращающая указатель на начало его данных типа char* :
char * data();в условном операторе среди других есть конструкция
(*(ba.data()+n-1)==0xd9)и в Ubuntu 10.04 на неё выдаётся предупреждение
warning: comparison always false due to limited range of data typeНо ведь это данные типа char, однобайтовые, так что не так?
Пётр.
И ещё одно странное явление - в маленькой программе на Qt в Ubuntu 11.04 успешно
компилируется конструкция, которая в Ubuntu 10.04 компилируется с предупреждением.
Именно, есть объект
Это что то связано с qt (точных объяснений увы не помню). Вроде как с приведением к определенному типу. Варианты решения: попробуйте использовать Qlist<qint8> вместо QByteArray и/или \xd9 вместо 0xd9.
По первому вопросу. Попробую еще раз ткнуть пальцем в небо.
- проверь сколько раз срабатывает ReadyRead
- проверь снифером какая реально инфа идет и в каком объеме
[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, обе скомпилированные.
Пётр.
По первому вопросу. Попробую еще раз ткнуть пальцем в небо.
- проверь сколько раз срабатывает ReadyRead
- проверь снифером какая реально инфа идет и в каком объеме
При таком небольшом количестве данных они должны приниматься с 1-го раза, но проверю.
Я помню, специально экспериментировал в другоq программе с readAll и оказалось, что до 16KB
принимаются с 1-го раза, а если передавать больше, то могут за несколько раз.
Пётр.
По первому вопросу. Попробую еще раз ткнуть пальцем в небо.
- проверь сколько раз срабатывает ReadyRead
- проверь снифером какая реально инфа идет и в каком объеме
Так она принимается в слоте, соединённом с сигналом readyRead() и за один раз
принимаются эти 16 байтов.
Сегодня в конце дня возникла другая проблема - в этой же программе есть другое
tcp-соединение, оно устанавливается по команде и затем по нему передаются jpg,
так вдруг оно стало само собой закрываться сразу же после открытия - я даю команду,
это внутри клиента, соединение устанавливается и тут же разрывается, по какой причине,
установить пока не удалось. Т.е. сокет соединяется с сервером в другой программе и тут
же рассоедниняется. Ошибка 1, сообщение не помню, но просто что связь разорвана.
С утра и позже работало.
Пётр.
Проверте еще раз не выходите ли гдето за границы диапазона, или не обращаетесь ли из разных потоков к одной переменной.
[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
char *pcb;
int n;
....
if( *(pcb+n-1) != 0xd9 )
При выводе
fprintf(stdout,"%02X",*(pcb+n-1));печатается FFFFFFD9, т.е. char рассматривается как int.
Если же написать
if( (unsigned char)(*(pcb+n-1)) != 0xd9 )то это работает как и ожидалось, а вышеприведённый вывод печатает D9.
Пётр.
Peter, нафига вообще такая конструкция нужна? ведь можно же по-человечески написать pcb[n-1]
Peter, нафига вообще такая конструкция нужна? ведь можно же по-человечески написать pcb[n-1]
Иногда я использую её, иногда []. Они же равнозначны.
Пётр.