Моя цель - создать уникальный идентификатор для всей пары IP-адрес - порт. UID должен быть одинаковым во всех системах (не должно конфликтовать для разных систем с прямым порядком байтов). Размер UID IPV4 составляет 6 байт, а для ipv6 - 18 байт.
uint8_t sourcePair[18]; /*ipv4=(4+2) bytes or ipv6=(16+2) bytes*/
У меня есть две функции, которые будут принимать удаленную конечную точку сокета и получать желаемый UID. Конструкция выглядит следующим образом.
void CmdInterpreter::makeSourcePairV4(asio::ip::tcp::endpoint& remoteEp, unsigned short portNum, unsigned char(&binSourcePair)[18])
{
auto addressClass = remoteEp.address().to_v4();
auto ipBin = addressClass.to_uint();
memcpy(&binSourcePair[0], &ipBin, 4);
memcpy(&binSourcePair[4], &portNum, 2);
}
void CmdInterpreter::makeSourcePairV6(asio::ip::tcp::endpoint& remoteEp, unsigned short portNum, unsigned char(&binSourcePair)[18])
{
auto addressClass = remoteEp.address().to_v6();
auto ipBin = addressClass.to_bytes();
memcpy(&binSourcePair[0], &ipBin[0], 16);
memcpy(&binSourcePair[16], &portNum, 2);
}
Так называются эти функции
remoteEp = socketPtr->remote_endpoint();
if (remoteEp.address().is_v4())
CmdInterpreter::makeSourcePairV4(remoteEp, remoteEp.port(), sourcePair);
else
CmdInterpreter::makeSourcePairV6(remoteEp, remoteEp.port(), sourcePair);
Здесь проблема заключается в том, что единственный способ получить доступ к базовым данным IPv6 - использовать to_byte (), который выдаст данные в сетевом порядке байтов. Кроме того, я делаю memcopy в unsigned short, который является многобайтовым по длине. Это работает? Это безопасный способ? Есть ли какие-нибудь обходные пути?