Russian Qt Forum
Май 20, 2024, 23:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: проблема с QudpSocket::readDatagram  (Прочитано 3891 раз)
Mark_T
Гость
« : Октябрь 24, 2010, 21:45 »

Доброго всем времени суток! У меня такая проблема: есть UDP клиент который переводит количество время в количество секунд и раскидывает на трехбайтные слова и отсылает, в принципе работает (проверял сниффером), но для наглядности код такой:
Код:
int t=3600*timeHspinBox->value() +60*timeMspinBox->value() + timeSspinBox->value();
int t1,t2,t3;
t3=t %pow(2,8);
t2=(t/pow(2,8))%256;
t1=(t/pow(2,16))%256;
char buf[4]={2,t1,t2,t3};
udpsocket->qsenddata(str, buf,4);


функция qsenddata
Код:
void qsenddata(QString str, char msg[], int n){
QUdpSocket *udpSocket;
const QHostAddress address=QHostAddress(str);
char buf[100];
memset(buf, 0, 100);
for (int i=0;i<n;i++) {
buf[i]=msg[i];
}
qint64 size=100;
quint16 dport=45454;
udpSocket = new QUdpSocket(this);
udpSocket->writeDatagram(buf,size,address,dport);


проблема в следующем : есть серверная часть (приведу только значимые места кода):

 
Код:
 struct Forsend {
    QString ipadr;
   char ipdat[10];
};

....................

void processDatagrams() {
      Forsend senda;
   while (udpSocket->hasPendingDatagrams()) {
           
       QHostAddress adr;
       quint16 prt;
                       udpSocket->readDatagram(senda.ipdat,10,&adr,&prt);
                       senda.ipadr =adr.toString();

QMessageBox msgBox;
int index;
QString ts;

index =senda.ipdat[3]+senda.ipdat[2]*256+senda.ipdat[1]*256*256;
        ts.setNum(index);
msgBox.setText(ts);
                        msgBox.exec();

   emit returndata(senda);
 
 
 
  }
}


Так вот проблема в том, что данные считываемые в senda.ipdat   не всегда соответствуют переданным. Пробовал считывать просто в массив char и в QByteArray, эффект тот же. Есть подозрение что при приеме пакета данные по особому "распаковываются", но некоторые значение времени передаются точно, а некоторые нет. Я в программировании совсем новичок и может здесь куча ошибок. Спасибо заранее.
Записан
Mark_T
Гость
« Ответ #1 : Октябрь 25, 2010, 11:30 »

Проблема разрешилась, и скорее всего связана с моим незнанием С++. Проблема оказалось втом, что при считывани  с char  в int старший бит воспринимается как знаковый. Устранил это дело следующей вставкой
Код:
                       int t[3];
t[0]=senda.ipdat[1];
t[1]=senda.ipdat[2];
t[2]=senda.ipdat[3];
for (int i=0; i<3; i++) {
if (t[i]<0) { t[i]=t[i]+256; }
}
index =t[2]+t[1]*256+t[0]*256*256;

Если есть код в стиле С++, прошу указать, какой
Записан
picobrain
Гость
« Ответ #2 : Октябрь 25, 2010, 18:21 »

Да, это так, но проблема была не только в старшем байте, но и в двух младших.
Всё дело в машинном представлении знаковых и беззнаковых чисел:

Код:
#include <stdio.h>



int main(){

char src=189; //Недопустимое число для char, как и t1,t2,t3 у Вас = [0..255]

int sign_val=src;

int unsign_val=(unsigned char)(src); //те же самые биты

printf("%i %i\n",sign_val,unsign_val);

return 0;
};

Записан
Mark_T
Гость
« Ответ #3 : Октябрь 25, 2010, 18:51 »

Да уж ). Век живи, как грится. Спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.043 секунд. Запросов: 18.