-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatabaseutils.cpp
More file actions
69 lines (61 loc) · 2.05 KB
/
Copy pathdatabaseutils.cpp
File metadata and controls
69 lines (61 loc) · 2.05 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
//databaseutils.cpp
#include "databaseutils.h"
int send_data(int fd, const char * message, ssize_t bytes){
ssize_t bytes_sent = 0;
ssize_t s;
while (bytes_sent < bytes){
s = send(fd, message, bytes - bytes_sent, 0);
if(s < 0){
std::cerr << "Error: " << strerror(errno) << std::endl;
return -1;
}
bytes_sent += s;
message += s;
}
return 0;
}
int recieve_data(int fd, char * buffer, ssize_t bytes){
ssize_t bytes_recieved = 0;
ssize_t s;
while( bytes_recieved < bytes){
s = recv(fd, buffer, bytes - bytes_recieved, 0);
if(s < 0){
std::cerr << "Error: " << strerror(errno) << std::endl;
return -1;
}
bytes_recieved += s;
buffer += s;
}
return 0;
}
bool send_message(int fd, Message msg){
MessageHeader header;
header.messageSize = sizeof(MessageHeader) + msg.body.size();
// 2. Allocate the buffer and copy data
std::vector<char> messageBuffer(header.messageSize);
memcpy(messageBuffer.data(), &header, sizeof(MessageHeader));
memcpy(messageBuffer.data() + sizeof(MessageHeader), msg.body.data(), msg.body.size());
if (send_data(fd, messageBuffer.data(), header.messageSize) < 0)
return false;
return true;
}
bool recieve_message(int fd, Message& msg){
std::vector<char> headerBuffer(sizeof(MessageHeader));
int s = recieve_data(fd, headerBuffer.data(), sizeof(MessageHeader));
if (s < 0){
std::cerr << "Error: " << strerror(errno) << std::endl;
return false;
}
MessageHeader *ptr = reinterpret_cast<MessageHeader *>(headerBuffer.data());
msg.header = *ptr;
if (msg.header.messageSize <= sizeof(MessageHeader)) {
std::cerr << "Error: invalid message with only message header"<< std::endl;
return false; // Invalid size
}
int s = recieve_data(fd, msg.body.data(), msg.header.messageSize);
if (s < 0){
std::cerr << "Error: " << strerror(errno) << std::endl;
return false;
}
return true;
}