crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Передача структуры между процессами
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
kwisp Дата 21.2.2011, 18:30
  pulo,
лучше конечно проверять сколько ты вычитал.
и читать пока есть доступные байты. bool bytesAvaliable() что ли.
pulo Дата 21.2.2011, 15:36
  Решил проблему просто:
    QLocalSocket *clientConnection = server->nextPendingConnection();
    clientConnection->waitForReadyRead(100);
    char *data;
    data = new char[40];
    clientConnection->read(data, 40);
    tg_query *query = (tg_query *)data;


с классами потоков так и не получилось реализовать.
xls Дата 21.2.2011, 14:40
  A data stream is a binary stream of encoded information which is 100% independent of the host computer's operating system
То есть нельзя записать "raw unencoded binary data" в демоне и считать их через "stream of encoded information"
pulo Дата 21.2.2011, 11:24
  Демон отправляет так:
int
forward_query_to_frontend (struct tg_query query)
{

    int retval;
    int sockfd;

    struct sockaddr_un address;
    struct tg_query answer;

    sockfd = socket (AF_UNIX, SOCK_STREAM, 0);

    /*  Name the socket, as agreed with the server.  */
    address.sun_family = AF_UNIX;
    strcpy(address.sun_path, PATH_FRONTEND);

    /*  Now connect our socket to the server's socket.  */
    retval = connect (sockfd, (struct sockaddr *)&address, sizeof(address));

    if(retval == -1)
    {
    close(sockfd);
    return -1;
    }
    // forwards the module query to the frontend
    query.sender = TG_DAEMON;


    retval = send(sockfd, &query, sizeof(struct tg_query), 0);

    retval =  recv(sockfd, &answer, sizeof(answer), 0);

    close(sockfd);
    return answer.query_data; // answer frontend
    
}


так нормально считывает:

    struct tg_query received;
    int retval=-1;
    retval =  recv(socket, &received, sizeof(struct tg_query), MSG_WAITALL);
panter_dsd Дата 21.2.2011, 10:25
  Привел бы код записи в сокет.
pulo Дата 21.2.2011, 2:49
  Вобщем пытаюсь передать структуру вида:
struct tg 
{
  __u8 sender;
  __u32 seqno;
  __u8 type;
  __u32 query_data;
  __u32 ip[4];
  __u32 sin_port;
  __u8 protocol;
  __u8 family;
};

используя unix сокеты, есть демон который покдлючается к оболочке на Qt, если считывать/записывать используя не qt'шные recv и write то все гуд.
Проблема возникает при считывании используя Qt методы:
сервер создаю:
server = new QLocalServer(this);
if (!server->listen("/tmp/tg"))  {}
connect(server, SIGNAL(newConnection()), this, SLOT(read_socket()));

и соответственно метод:
void Window::read_socket()
{
    QLocalSocket *clientConnection = server->nextPendingConnection();
    QDataStream in(clientConnection);
    in.setVersion(QDataStream::Qt_4_0);
        clientConnection->waitForReadyRead(10000); // без него одни нули
        in >> query-> sender;
    in >> query->seqno;
    in >> query->query_type;
    in >> query->query_data;
    in >> query->ip1;
    in >> query->ip2;
    in >> query->ip3;
    in >> query->ip4;
    in >> query->sin_port;
    in >> query->protocol;
    in >> query->family;
        ...
}

в Qt структуру объявил как:
struct tg_query 
{
    quint8 sender;
    quint32 seqno;
    quint8 query_type;
    quint32 query_data;
    quint32 ip[4];
    quint32 sin_port;
    quint8 protocol;
    quint8 family;
};

но вот значения принимаются явно не те, что отправляются клиентом.
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 4.7.2025, 22:41