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;
};

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


Новичок


Группа: Новичок
Сообщений: 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);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 15.1.2025, 16:11