Message Queue, die Zweite

18/07/2013 - 17:12 von Heinz-Mario Frühbeis | Report spam
Dieses Testprogramm (bis <<Test-Programm/ENDE>>) làuft einwandfrei durch.
Die msgID bleibt immer 0.

<<Test-Programm/Anfang>>
#define MSGSIZE 512
#define MSG_KEY (key_t)1097

int main(int argc, char *argv[]){
int msgID;
struct myMsg {
long mtype;
char mtext[MSGSIZE];
} dataMsg;

msgID = msgget(MSG_KEY, IPC_CREAT | 0666);
if (msgID >= 0) {
strncpy(dataMsg.mtext, "Hallo CLIENT", MSGSIZE);
std::cout<<"Sende Message ID "<< msgID;
std::cout.flush();
dataMsg.mtype = 21;
if (-1==msgsnd(msgID, &dataMsg, MSGSIZE, 0)) {
perror("msgsnd"); /* Fehler */
} else {
/* Wir sind durchglaufen */
std::cout<<"Daten gesendet: "<< dataMsg.mtext;
std::cout.flush();
}
sleep(3);
dataMsg.mtype = 20;
if (-1==msgsnd(msgID, &dataMsg, MSGSIZE, 0)) {
perror("msgsnd"); /* Fehler */
} else {
/* Wir sind durchglaufen */
std::cout<<"Daten gesendet: "<< dataMsg.mtext;
std::cout.flush();
}

} else {
perror("msgget");
}
return 0;
}
<<Test-Programm/ENDE>>

Ab hier beginnt meine eigene Kreation.
Die h-Datei:
class c_Message{
friend class cIDA;
private:
struct myMsg {
long MsgType;
long Sender;
long Ident;
char MsgText[256];
} dataMsg;
size_t MsgSize;
long MsgType;
int MsgID;
key_t ServerID;
c_IDAFunc IDAFunc;
c_Message(){
this->MsgSize = 256;
this->MsgType = 0;
}
int Init(){
int nID;
key_t nKey;
nID = IDAFunc.Create_MsgServerID(); // hier wird eine ServerID
erzeugt, die kleiner als 8192 ist
nKey = static_cast<key_t>(nID);
this->ServerID = nKey; //max 8192
this->MsgType = 20;
this->MsgID = msgget(this->ServerID, IPC_CREAT | 0666);
return this->MsgID;
}
void Clear(){
this->ServerID = -1;
this->MsgID = -1;
this->MsgType = -1;
}
};

class cIDA{
private:
c_Message MsgServer;
public:
...
};

Die cpp-Datei:
cIDA::cIDA(long vOwner, int &vLzStat){
this->MsgServer.Init();
IDASendMessage(this->IDA.Ident, this->IDA.Ident, 0, "Hallo ", "IDA");
}

int cIDA::IDASendMessage(long vSender, long vIdent, long vMsg
, std::string vParam, std::string vParam1){
int nRetVal = 0;
std::string nStr;
const char *nChar;
nStr = "-" + vParam + vParam1 + "-";
nChar = ChStringChar(nStr);
this->MsgServer.dataMsg.MsgType = vMsg;
this->MsgServer.dataMsg.Sender = vSender;
this->MsgServer.dataMsg.Ident = vIdent;
strncpy(this->MsgServer.dataMsg.MsgText, nChar,
this->MsgServer.MsgSize);
nRetVal = msgsnd(this->MsgServer.MsgID, &this->MsgServer.dataMsg
, this->MsgServer.MsgSize, 0);
if(nRetVal < 0){Std_Cout("", "MSG SEND ERROR");} else{nRetVal = 1;}
return nRetVal;
}

Hier hat msgsnd immer 'nen Fehler und ich komme ums verrecken einfach
nicht dahinter, warum. Ich erkenne, vom Programmablauf her, keinen
Unterschied zu dem Test-Programm.
Außerdem wird dabei die msgID immer um 32768 hoch gezàhlt, wo doch im
Test-Programm die msgID immer 0 ist.

Einige Ausgaben dazu:
msgID = 131072 ServerID= 6108
msgID = 163840 ServerID= 1299
msgID = 196608 ServerID= 1552

Zumal ich in einer quasi "Vorab-Version" keine Probleme hatte.
Da habe ich in IDA (meinem Hauptprogramm) 2 dyn Bibliotheken "geforkt"
(also jeweils immer eine).
Dann habe ich von IDA aus eine Nachricht an eine Bibliothek gesandt und
von der Bibliothek aus dann eine Nachricht an die andere.
Nach Empfang/Senden, bzw. nur Empfang wurde das Programm dann beendet.

Was mir auch noch aufgefallen ist:
Wenn ich in c_Message im Strukt irgendwas àndere, dann stürzt das
Programm ab, dann muss ich erst in main() irgendwas àndern, z. Bsp.
einmal die Leertaste drücken, dann làuft das Programm wieder durch.

Liegt es am QT-Creator, an der Linux-Distri, am Code?

Ich weiß wirklich nicht mehr selber weiter und bin nahe dran alles an
die Wand zu werfen...

Heinz-Mario Frühbeis
 

Lesen sie die antworten

#1 Heinz-Mario Frühbeis
18/07/2013 - 18:07 | Warnen spam
Ich antworte dann auch gleich mal selber:
Alles neu aufgesetzt und nur msgget und msgsnd aufgerufen und es wird
gesendet. Auch kann ich das Strukt wieder àndern, ohne das das Programm
dann abstürzt.
Aber den Grund dafür, daß es jetzt (wieder) klappt, kenne ich nicht.

Auch das hoch zàhlen der msgID habe ich erkannt:
Wenn ich
#define MSG_SERVER_ID (key_t) 1011
einsetze, dann bleibt die msgID bei 0 (oder eben gleich).

Wenn ich
int tmpID;
key_t MSG_SERVER_ID;
tmpID = 1012;
MSG_SERVER_ID = static_cast<key_t>(tmpID);
einsetze, dann wird msgID hoch gezàhlt.

Es scheint also am '#define' zu liegen.
Kriegt man das irgendwie hin, daß man eine ServerID generiert und msgID
trotzdem gleich bleibt (nach dem nàchsten Start)?

H-MF

Ähnliche fragen