crossplatform.ru

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

> Передача структуры между процессами, unix сокеты
pulo
  опции профиля:
сообщение 21.2.2011, 2:49
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 21.2.2011
Пользователь №: 2426

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вобщем пытаюсь передать структуру вида:
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;
};

но вот значения принимаются явно не те, что отправляются клиентом.
Причина редактирования: применяй теги!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов (1 - 5)
panter_dsd
  опции профиля:
сообщение 21.2.2011, 10:25
Сообщение #2


Жаждущий знаний
***

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

Спасибо сказали: 32 раз(а)




Репутация:   3  


Привел бы код записи в сокет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
pulo
  опции профиля:
сообщение 21.2.2011, 11:24
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 21.2.2011
Пользователь №: 2426

Спасибо сказали: 0 раз(а)




Репутация:   0  


Демон отправляет так:
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);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
xls
  опции профиля:
сообщение 21.2.2011, 14:40
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 44
Регистрация: 6.9.2010
Пользователь №: 2013

Спасибо сказали: 7 раз(а)




Репутация:   2  


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, 15:36
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 21.2.2011
Пользователь №: 2426

Спасибо сказали: 0 раз(а)




Репутация:   0  


Решил проблему просто:
    QLocalSocket *clientConnection = server->nextPendingConnection();
    clientConnection->waitForReadyRead(100);
    char *data;
    data = new char[40];
    clientConnection->read(data, 40);
    tg_query *query = (tg_query *)data;


с классами потоков так и не получилось реализовать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 21.2.2011, 18:30
Сообщение #6


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


pulo,
лучше конечно проверять сколько ты вычитал.
и читать пока есть доступные байты. bool bytesAvaliable() что ли.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.12.2024, 4:08