46 void Transmitter::sendMessage(uint8_t opCode,
const char* message, std::size_t messageLength) {
47 send(
true, opCode, message, messageLength);
50 void Transmitter::sendMessageStart(uint8_t opCode,
const char* message, std::size_t messageLength) {
51 send(
false, opCode, message, messageLength);
54 void Transmitter::sendMessageFrame(
const char* message, std::size_t messageLength) {
55 send(
false, 0, message, messageLength);
58 void Transmitter::sendMessageEnd(
const char* message, std::size_t messageLength) {
59 send(
true, 0, message, messageLength);
62 void Transmitter::send(
bool end, uint8_t opCode,
const char* message, std::size_t messageLength) {
63 std::size_t messageOffset = 0;
66 const std::size_t sendFrameLength =
67 (messageLength - messageOffset <= WSMAXFRAMEPAYLOADLENGTH) ? messageLength - messageOffset : WSMAXFRAMEPAYLOADLENGTH;
69 const bool fin = (sendFrameLength == messageLength - messageOffset) && end;
71 sendFrame(fin, opCode, message + messageOffset, sendFrameLength);
73 messageOffset += sendFrameLength;
76 }
while (messageLength - messageOffset > 0);
79 void Transmitter::sendFrame(
bool fin, uint8_t opCode,
const char* payload, uint64_t payloadLength) {
82 if (payloadLength < 126) {
83 length = payloadLength;
84 }
else if (payloadLength < 0x10000) {
91 header[0] =
static_cast<
char>((fin ? 0b10000000 : 0) | opCode);
93 header[1] =
static_cast<
char>((masking ? 0b10000000 : 0) | length);
95 sendFrameData(header, 2);
99 sendFrameData(
static_cast<uint16_t>(payloadLength));
102 sendFrameData(payloadLength);
111 MaskingKey maskingKeyAsArray = {.keyAsValue = distribution(randomDevice)};
113 if (payloadLength > 0) {
114 LOG(TRACE) <<
"WebSocket send: Frame data\n" << utils::hexDump(payload, payloadLength, 32,
true);
118 sendFrameData(htobe32(maskingKeyAsArray.keyAsValue));
120 for (uint64_t i = 0; i < payloadLength; i++) {
121 *(
const_cast<
char*>(payload) + i) =
static_cast<
char>(*(payload + i) ^ *(maskingKeyAsArray.keyAsBytes + i % 4));
125 sendFrameData(payload, payloadLength);
128 for (uint64_t i = 0; i < payloadLength; i++) {
129 *(
const_cast<
char*>(payload) + i) =
static_cast<
char>(*(payload + i) ^ *(maskingKeyAsArray.keyAsBytes + i % 4));
161 void Transmitter::sendFrameData(
const char* frame, uint64_t frameLength)
const {
163 uint64_t frameOffset = 0;
166 std::size_t sendChunkLen =
167 (frameLength - frameOffset <= SIZE_MAX) ?
static_cast<std::size_t>(frameLength - frameOffset) : SIZE_MAX;
169 socketConnection->sendToPeer(frame + frameOffset, sendChunkLen);
171 frameOffset += sendChunkLen;
172 }
while (frameLength - frameOffset > 0);