//POLA KLASY PACKET
int type; //typ działania arytmetyczno-logicznego, 2 bity
long long num1; //pierwsza liczba, 64 bity
long long num2; //druga liczba, 64 bity
long long num3; //trzecia liczba, 64 bity
int state; //pole statusu, 4 bity
int id; //identyfikator sesji, 4 bity
//SERIALIZACJA PAKIETU
std::string Packet::packetToString()
{
//serializacja poszczególnych pól i łączenie w jeden bitset
std::bitset<208> pak(std::string(std::bitset<2>(type).to_string() + std::bitset<64>(num1).to_string() + std::bitset<64>(num2).to_string() + std::bitset<64>(num3).to_string() + std::bitset<4>(state).to_string() + std::bitset<4>(id).to_string() + "000000")); //208 bitowy bitset złożony z połączonych pól
std::string temp;
std::bitset<8> tempBitset(0);
//podział dużego bitsetu na bajty
for (int i = pak.size() - 1; i >= 0; i--)
{
tempBitset[i % 8] = pak[i];
if (i % 8 == 0)
{
//zamiana bajtów na chary
char t = static_cast<char> (tempBitset.to_ulong());
//łączenie w pojedynczy string
temp.push_back(t);
}
}
return temp;
}
//WYSYŁANIE PAKIETU
void UDPSocket::SendTo(const std::string &address, unsigned short port, string &packet, int len, int flags)
{
sockaddr_in add;
add.sin_family = AF_INET;
add.sin_addr.s_addr = inet_addr(address.c_str());
add.sin_port = htons(port);
int ret = sendto(sock, packet.c_str(), len, flags, (sockaddr*)&add, sizeof(add));
if (ret < 0)
throw std::system_error(WSAGetLastError(), std::system_category(), "sendto failed");
}
Jeśli podam odpowiednio duże liczby, dla których żaden char nie przyjmuje wartości 0x00, cały pakiet się wysyła i wszystko działa bez problemu, w innym wypadku wysyła tylko do wystąpienia pierwszego nulla.