forked from zhmzhen/candcppCode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcppThreadMsgQueue.cpp
More file actions
95 lines (86 loc) · 2.76 KB
/
cppThreadMsgQueue.cpp
File metadata and controls
95 lines (86 loc) · 2.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include <string>
#include <thread>
#include <chrono>
#include <atomic>
#include <memory>
//message queue
#include <sys/ipc.h>
#include <sys/msg.h>
#include <cstring>
#include <unistd.h>
#define MSG_KEY 1234
struct Message {
long msg_type;
char msg_text[512];
};
void MQ_server(void) {
std::cout << "\tMQ_server, Server is running..." << std::endl;
int msgid = msgget(MSG_KEY, 0666 | IPC_CREAT);
if (msgid == -1) {
std::cout << "MQ_server: Faild to create msgid" << std::endl;
return;
}
std::cout << "\tMQ_server, while..." << std::endl;
while (true) {
struct Message msg;
// Receive message from client
if (msgrcv(msgid, &msg, sizeof(msg.msg_text), 1, 0) == -1) {
std::cout << "MQ_server: Faild to msgrcv" << std::endl;
return;
}
std::cout << "\tMQ_server,Received: type is " << msg.msg_type << std::endl;
// Prepare response message
msg.msg_type = 2; // Response type
strcpy(msg.msg_text, "Message received!");
// Send response to client
if (msgsnd(msgid, &msg, sizeof(msg.msg_text), 0) == -1) {
std::cout << "MQ_server: Faild to snd" << std::endl;
return;
}
std::cout << "\tMQ_server,Response sent." << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(5));
break;
}
std::cout << "\tMQ_server, exit..." << std::endl;
// Cleanup (unreachable in this loop, but good practice)
msgctl(msgid, IPC_RMID, nullptr);
return;
}
void MQ_client(void) {
std::cout << "\tClient is running..." << std::endl;
int msgid = msgget(MSG_KEY, 0666);
if (msgid == -1) {
std::cout << "MQ_client: Faild to msgget" << std::endl;
return;
}
struct Message msg;
std::cout << "\tMQ_client: msgid=" << msgid << "sizeof(msg)=" << sizeof(msg) << std::endl;
msg.msg_type = 1; // Request type
strcpy(msg.msg_text, "Hello, Server!");
// Send message to server
std::cout << "\tMQ_client: msgsnd, sizeof(msg.msg_text)=" << sizeof(msg.msg_text) << "leng=" << strlen(msg.msg_text) << std::endl;
if (msgsnd(msgid, &msg, sizeof(msg.msg_text), 0) == -1) {
//if (msgsnd(msgid, &msg, sizeof(msg) - sizeof(msg.msg_type), 0) == -1) {
std::cout << "MQ_client: Faild to msgsnd" << std::endl;
return;
}
std::cout << "\tMQ_client: msgsnd done to server" << std::endl;
// Receive response from server
if (msgrcv(msgid, &msg, sizeof(msg.msg_text), 2, 0) == -1) {
std::cout << "MQ_client: Faild to msgrcv" << std::endl;
return;
}
std::cout << "\tMQ_client: got resp from server and exit" << std::endl;
return;
}
int main() {
std::cout << "main: thread enter" << std::endl;
std::thread t1(MQ_server);
t1.detach();
std::this_thread::sleep_for(std::chrono::seconds(10));
std::thread t2(MQ_client);
t2.detach();
std::cout << "main: thread exit" << std::endl;
return 0;
}