fucked up ignore this
This commit is contained in:
parent
1abe57aad1
commit
7301f20fb7
4 changed files with 130 additions and 0 deletions
67
server/src/sock/packet.cpp
Normal file
67
server/src/sock/packet.cpp
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
#include "packet.hpp"
|
||||||
|
|
||||||
|
int sosc::Packet::Parse(const std::string& data, std::string* extra) {
|
||||||
|
const unsigned char* raw =
|
||||||
|
(const unsigned char*)data.c_str();
|
||||||
|
auto length = data.length();
|
||||||
|
|
||||||
|
if(length < 2)
|
||||||
|
return PCK_MORE;
|
||||||
|
|
||||||
|
if(raw[0] != 0xB0 || raw[1] != 0x0B)
|
||||||
|
return PCK_ERR;
|
||||||
|
|
||||||
|
if(length < 6)
|
||||||
|
return PCK_MORE;
|
||||||
|
|
||||||
|
uint32_t expected_length = net::ntohv<uint32_t>(data, 2);
|
||||||
|
if(expected_length > PCK_MAX_LEN || expected_length < 8)
|
||||||
|
return PCK_ERR;
|
||||||
|
if(length < expected_length)
|
||||||
|
return PCK_MORE;
|
||||||
|
|
||||||
|
this->id = data[6];
|
||||||
|
std::vector<uint32_t> region_lengths;
|
||||||
|
int region_count = data[7], ptr = 8;
|
||||||
|
for(int i = 0; i < region_count; ++i) {
|
||||||
|
if(ptr >= length)
|
||||||
|
return PCK_ERR;
|
||||||
|
|
||||||
|
switch(raw[ptr]) {
|
||||||
|
default:
|
||||||
|
region_lengths.push_back(raw[ptr]);
|
||||||
|
break;
|
||||||
|
case 254:
|
||||||
|
if(ptr + 2 >= length)
|
||||||
|
return PCK_ERR;
|
||||||
|
|
||||||
|
region_lengths.push_back(
|
||||||
|
net::ntohv<uint16_t>(data, ptr + 1)
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case 255:
|
||||||
|
if(ptr + 4 >= length)
|
||||||
|
return PCK_ERR;
|
||||||
|
|
||||||
|
region_lengths.push_back(
|
||||||
|
net::ntohv<uint32_t>(data, ptr + 1);
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sosc::Packet::Check(int region_count, ...) {
|
||||||
|
if(region_count > 0xFF)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
va_list args;
|
||||||
|
va_start(args, region_count);
|
||||||
|
for(int i = 0; i < region_count; ++i) {
|
||||||
|
uint32_t length = va_arg(args, uint32_t);
|
||||||
|
if(length != PCK_ANY && this->regions[i].length() != length)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
38
server/src/sock/packet.hpp
Normal file
38
server/src/sock/packet.hpp
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
#ifndef SOSC_PACKET_H
|
||||||
|
#define SOSC_PACKET_H
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
#include <cstdarg>
|
||||||
|
#include "../utils/net.hpp"
|
||||||
|
|
||||||
|
#define PCK_ANY 0
|
||||||
|
|
||||||
|
#define PCK_OK 0
|
||||||
|
#define PCK_MORE 1
|
||||||
|
#define PCK_ERR -1
|
||||||
|
|
||||||
|
#define PCK_MAX_LEN 0xFFFFFFFF
|
||||||
|
|
||||||
|
namespace sosc {
|
||||||
|
class Packet {
|
||||||
|
public:
|
||||||
|
int Parse(const std::string& data, std::string* extra = nullptr);
|
||||||
|
bool Check(int region_count, ...);
|
||||||
|
|
||||||
|
inline uint8_t GetId() const {
|
||||||
|
return this->id;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::string operator []
|
||||||
|
(const std::vector<std::string>::size_type index) const
|
||||||
|
{
|
||||||
|
return regions[index];
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
uint8_t id;
|
||||||
|
std::vector<std::string> regions;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
2
server/src/sock/scapesock.cpp
Normal file
2
server/src/sock/scapesock.cpp
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#include "scapesock.hpp"
|
||||||
|
|
23
server/src/sock/scapesock.hpp
Normal file
23
server/src/sock/scapesock.hpp
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
#ifndef SOSC_SCAPESOCK_H
|
||||||
|
#define SOSC_SCAPESOCK_H
|
||||||
|
|
||||||
|
#include "packet.hpp"
|
||||||
|
#include "tcpsock.hpp"
|
||||||
|
|
||||||
|
namespace sosc {
|
||||||
|
class ScapeConnection {
|
||||||
|
public:
|
||||||
|
|
||||||
|
private:
|
||||||
|
sosc::TcpClient client;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ScapeServer {
|
||||||
|
public:
|
||||||
|
|
||||||
|
private:
|
||||||
|
sosc::TcpServer server;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue