2012-11-16 88 views
0

在那里我有一个过程被称为服务器和几个过程称为客户端,可以连接到服务器,但是发送消息<由于某种原因,我的客户端将无法连接到我的服务器:mqd_t,发送和接收我工作的一个程序消息

这是客户端类的头文件:

#ifndef CLIENT_H 
#define CLIENT_H 

#include <QString> 
#include <string> 
#include <QByteArray> 
#include <mqueue.h> 
#include <iostream> 
#include "serveredialog.h" 
#include "badudialog.h" 
#include "../src/messages.h" 

class Client 
{ 
public: 
    Client(); 
    void init(QString name); 
    void sendMessage(QString mess); 
private: 
    char *myMailboxName, buf[MSG_SIZE]; 
    struct mq_attr attr; 
    mqd_t mq_ownBox, mq_centralBox; 

}; 

#endif // CLIENT_H 

这是客户端CPP文件:

#include "Client.h" 

using namespace std; 

Client::Client() 
{ 
    attr.mq_maxmsg = 10; 
    attr.mq_msgsize = MSG_SIZE; 
    attr.mq_flags = 0; 
} 

void Client::init(QString name) 
{ 
    //Convert name into char* 
    QByteArray byteArray = name.toUtf8(); 
    char str1[40]; 
    const char* tempr = byteArray.constData(); 
    strncpy(str1, tempr, sizeof(str1)); 
    myMailboxName = str1; 

    //Create temp box to check if name available 
    string tempS = myMailboxName; 
    tempS += "new"; 
    const char* tempr1 = tempS.data(); 
    mq_unlink(tempr1); 
    mq_ownBox = mq_open(tempr1, O_RDONLY | O_CREAT, S_IRWXU, &attr); 
    mq_centralBox = mq_open(CENTRALBOX, O_RDWR); 

    //Tell server that you are ready 
    string tempS1 = str1; 
    string tempS2 = "started:" + tempS1; 
    const char* tempr2 = tempS2.data(); 
    sprintf(buf, tempr2); 
    int tempI = mq_send(mq_centralBox, buf, strlen(buf), 0); 
    cout << tempI; 
    //Check for success 
    if(tempI){ 
     ServerEDialog sd; 
     sd.setModal(true); 
     sd.exec(); 
    } 
    else 
    { 
     //If success, wait for response fromserver 
     while(1) 
     { 
      int tempI2 = mq_receive(mq_ownBox, buf, MSG_SIZE, 0); 
      if(tempI2 != -1) 
      { 
       break; 
      } 
     } 
     QString tempS3 = buf; 

     //if invalid show error, otherwise create permanent mailbox 
     if(tempS3 == "invalidname") 
     { 
      BadUDialog bd; 
      bd.setModal(true); 
      bd.exec(); 
     } 
     else 
     { 
      mq_unlink(myMailboxName); 
      mq_ownBox = mq_open(myMailboxName, O_RDONLY | O_CREAT, S_IRWXU, &attr); 
     } 
    } 
} 

void Client::sendMessage(QString mess) 
{ 

} 

这是我的服务器的头文件:

#ifndef SERVER_H 
#define SERVER_H 

#include <QString> 
#include <mqueue.h> 
#include <QVector> 
#include <QStringList> 
#include <iostream> 
#include "../src/messages.h" 

class Server : public QObject 
{ 
    Q_OBJECT 
public: 
    Server(); 
    void start(); 
private: 
    void join(QString name); 
    char buf[MSG_SIZE], msgSend[MSG_SIZE]; 
    QVector<mqd_t> mq_external; 
    QVector<QString> users; 
    mqd_t mq_central; 
    struct mq_attr attr; 


signals: 
    void joined(QString name); 

}; 

#endif // SERVER_H 

这是我的服务器CPP文件:

#include "Server.h" 

using namespace std; 

Server::Server() 
{ 
} 

void Server::start(){ 

    attr.mq_maxmsg = 100; 
    attr.mq_msgsize = MSG_SIZE; 
    attr.mq_flags = 0; 

    mq_unlink(CENTRALBOX); 
    mq_central = mq_open(CENTRALBOX, O_RDONLY | O_CREAT, S_IRWXU, &attr); 
    while(1) 
    { 
     //Wait to recieve message from user 
     int tempMsgVal = mq_receive(mq_central, buf, MSG_SIZE, 0); 
     if(tempMsgVal != -1) 
     { 
      cout << tempMsgVal; 
     } 

     if(tempMsgVal != -1){ 
      QString tempS = buf; 
      QStringList tempSL = tempS.split(":"); 
      if(tempSL.size() == 2 && tempSL.at(0) == "started") 
      { 
       int x = 0; 
       bool exists = false; 
       for(int i = 0; i < mq_external.size(); i++) 
       { 
        x = QString::compare(tempSL[1], users.at(i), Qt::CaseInsensitive); 
        if(x == 0) 
        { 
         exists = true; 
         break; 
        } 
       } 

       if(!exists) 
       { 
        sprintf(buf,"joined"); 
        QString tempS1 = tempSL[1] + "new"; 
        QByteArray byteArray = tempS1.toUtf8(); 
        const char* tempr = byteArray.constData(); 
        mqd_t tempMQ = mq_open(tempr, O_RDWR); 
        int tempI = mq_send(tempMQ, buf, strlen(buf), 0); 

        join(tempSL[1]); 
       } 
       else 
       { 
        sprintf(buf,"invalidname"); 
        QString tempS1 = tempSL[1] + "new"; 
        QByteArray byteArray = tempS1.toUtf8(); 
        const char* tempr = byteArray.constData(); 
        mqd_t tempMQ = mq_open(tempr, O_RDWR); 
        int tempI = mq_send(tempMQ, buf, strlen(buf), 0); 
       }//Endelse 
      }//Endif 
     }//Endif 

    }//Endwhile 
} 

void Server::join(QString name) 
{ 
    emit joined(name); 
} 

这是messages.h文件,其中包括我在这两个类:

#ifndef MESSAGES_H 
#define MESSAGES_H 

#define MSG_SIZE 150 
#define CENTRALBOX "/CentralMailBox" 

#include <stdio.h> 
#include <stdlib.h> 

#endif // MESSAGES_H 

一些客户端和服务器类中的代码与gui有关,但我已经测试了该部分,并在正确的时间调用了相关的方法。

我的问题是,当我第一次调用客户端函数中的mq_send方法时,它返回并且错误,并且对于服务器类也是一样的,在发送和接收时是否有错误因为我无法想象出我的生活。

+0

什么是你所得到的错误?你需要测试mq调用的返回码,并用perror或whatnot打印errno的结果。 – Duck

+0

这两种方法都返回-1调用时,根据文档,这意味着该消息没有被成功地发送或接收。 – Amre

+0

是的,但错误代码在errno中。尝试'perror()'。 – Duck

回答

-1

我发现我哪里错了,它是联合国显示,但mq_ownbox,使用我从gui得到的名称,我忘了添加'/'的开始,至于mq_central,设置在maxmsg 100导致无效arguement