Я использую библиотеку UDT для отправки моих данных. Но, похоже, он не может правильно отправлять данные без знака *. С одной стороны отправляю как
int rc = UDT::sendmsg(socket, full_data, size, -1, true);
С другой стороны я получаю как:
unsigned char* data;
int size = 2500;
data = new char[size];
while (true) {
int rc = UDT::recvmsg(sock, data, size);
if (rc == -1) std::cout << "Error: " << UDT::getlasterror().getErrorMessage() << std::endl;
else std::cout << "Received packet of length" << rc << std::endl;
}
С обеих сторон количество отправленных / полученных байтов одинаково. Но данные разные. Когда я делаю вид
std::hash<unsigned char*> ptr_hash;
cout << "Hash: " << ptr_hash(data);
У меня разные хеши. В источниках UDT есть строки:
UDT_API int sendmsg(UDTSOCKET u, const char* buf, int len, int ttl = -1, bool inorder = false);
UDT_API int recvmsg(UDTSOCKET u, char* buf, int len);
Как видите, входные параметры — это char *, но не unsigned char * или void *. Означает ли это, что я должен отправлять только char * или использовать, например, base64 для кодирования моих двоичных данных?
Хитрый … Ты хешируешь свой указатель.
увидеть http://en.cppreference.com/w/cpp/utility/hash (под примечаниями)
Я бы порекомендовал напечатать шестнадцатеричное значение того, что вы отправляете на обоих концах, чтобы подтвердить, что оно одинаково, и это должно быть Если вы отправляете строку с нулевым символом в конце, вы можете пропустить нулевую строку. Но это, вероятно, не тот случай, если вы укажете, что это символы без знака.
Других решений пока нет …