Russian Qt Forum

Qt => Работа с сетью => Тема начата: borya95 от Апрель 04, 2014, 12:43



Название: QLocalServer/Socket обмен данными
Отправлено: borya95 от Апрель 04, 2014, 12:43
Как правильно реализовать постоянный прием и отправку данных между двумя процессами с помощью QLocalServer и QLocalSocket. На данный момент реализованно таким образом:

Серверная часть:
Код:
void thread1::run(){

    QString name="r111";
    if (!mw->m_server.listen(name)) {
          qDebug() << "Not able to start the Server";
     }
        mw->m_server.listen(name);
        connect(&mw->m_server, SIGNAL(newConnection()), this, SLOT(socket_new_connection()));
       
      exec();
  }




void thread1::socket_new_connection() {
    QLocalSocket *clientConnection = mw->m_server.nextPendingConnection();
    clientConnection->read(buf,2404);
    //QByteArray in(clientConnection->readAll());
    //char *data = in.data();
    memcpy(&a,&buf[0],4);
    memcpy(&b,&buf[4],2400);
    connect(clientConnection, SIGNAL(disconnected()),
                clientConnection, SLOT(deleteLater()));
    emit toMainWidget();

}

Клиентская часть:
Код:

ProcessingThread::ProcessingThread()
{

    m_socket = new QLocalSocket(this);
    m_serverName = "r111";

       connect(m_socket, SIGNAL(connected()), this, SLOT(socket_connected()));
       connect(m_socket, SIGNAL(disconnected()), this, SLOT(socket_disconnected()));

       connect(m_socket, SIGNAL(readyRead()), this, SLOT(socket_readReady()));
       connect(m_socket, SIGNAL(error(QLocalSocket::LocalSocketError)),
               this, SLOT(socket_error(QLocalSocket::LocalSocketError)));


}
void ProcessingThread::send_MessageToServer() {
    m_socket->abort();
    m_socket->connectToServer(m_serverName);



}


void ProcessingThread::socket_connected(){
    u_short *from = (u_short*)b ;
    memcpy(&msg[0],&a,4);
    memcpy(&msg[4],from,2400);
    m_socket->write(msg);
    m_socket->flush();
}

При данной реализации, прием происходит только один раз, после чего gui интерфейс замораживается.


Название: Re: QLocalServer/Socket обмен данными
Отправлено: kuzulis от Апрель 05, 2014, 11:36
Выбросить треды.


Название: Re: QLocalServer/Socket обмен данными
Отправлено: borya95 от Апрель 06, 2014, 17:18
Выбросить треды.
а они чем мешают?


Название: Re: QLocalServer/Socket обмен данными
Отправлено: Fregloin от Апрель 08, 2014, 09:35
Если линукс - то смотрите в сторону DBUS, довольно просто и не сложно + поддерживается Qt. В остальных ОС можно по разному.
Можно банально создать соединение по обычным сокетам. В линуксе есть и локальные сокеты (unix сокеты).


Название: Re: QLocalServer/Socket обмен данными
Отправлено: kuzulis от Апрель 08, 2014, 18:14
Цитировать
а они чем мешают?

А тем, что если не умеешь ими пользоваться и у тебя "замораживается" ГУЙ, то - лучше выброси их, т.к. толку ноль.  :)


Название: Re: QLocalServer/Socket обмен данными
Отправлено: borya95 от Апрель 10, 2014, 11:46
Цитировать
а они чем мешают?

А тем, что если не умеешь ими пользоваться и у тебя "замораживается" ГУЙ, то - лучше выброси их, т.к. толку ноль.  :)

ну так просвети где ошибка


Название: Re: QLocalServer/Socket обмен данными
Отправлено: borya95 от Апрель 10, 2014, 11:49
Если линукс - то смотрите в сторону DBUS, довольно просто и не сложно + поддерживается Qt. В остальных ОС можно по разному.
Можно банально создать соединение по обычным сокетам. В линуксе есть и локальные сокеты (unix сокеты).
я пробовал d-bus и пайпы , но они по пропускной способности не подошли, т.к. идет частый обмен сообщениями по 2500 байт, на глазок где-то каждые 2-3 мс.
upd : OS Linux


Название: Re: QLocalServer/Socket обмен данными
Отправлено: Fregloin от Апрель 13, 2014, 10:05
можете использовать  socket_pair.


Название: Re: QLocalServer/Socket обмен данными
Отправлено: borya95 от Апрель 14, 2014, 12:28
можете использовать  socket_pair.
спасибо попробую