Я читаю сообщения переменных байтов из сокетов в C. Но есть проблема, когда некоторый байт в любом сообщении равен \ 0. Он разделен на две части и отправляется только первая половина. На клиентской стороне также возникает проблема.Как читать сообщения сокетов
Пожалуйста, предложите любой формат, я могу использовать.
Одно решение, я должен сначала отправить размер сообщения, а затем отправить остальное сообщение. Это решит проблему, но обработка станет сложной.
Я ищу любые другие решения для очистки?
/**
Send data to the connected host
*/
bool send_data(const char* data) {
//Send some data
if (sendto(sock, data, strlen(data), 0,
(const struct sockaddr *) &server, length) < 0) {
perror("Send failed ");
return false;
}
std::cout << "Data sent: length=" << strlen(data) << " \n";
char str[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(server.sin_addr), str, INET_ADDRSTRLEN);
std::cerr << "server.sin_addr=" << str << std::endl;
return true;
}
/**
Receive data from the connected host
*/
void receive(char * buffer, size_t size) {
//Receive a reply from the server
if (recvfrom(sock, buffer, size, 0, (struct sockaddr *) &from, (socklen_t*) & length) < 0) {
puts("recv failed");
}
char str[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(from.sin_addr), str, INET_ADDRSTRLEN);
std::cerr << "from.sin_addr=" << str << std::endl;
}
Данные Посылаю является только целые числа, превращенного отлиты в char *
. Ну, некоторые целые числа малы, поэтому верхние байты в основном 00000000. Следовательно, моя проблема.
Являются ли данные, которые вы отправляете, текстовые или двоичные? Если вы отправляете двоичные данные, вы не можете использовать текстовые функции (например, 'strlen'). Гораздо больше, чем это невозможно сказать, не видя никакого кода, предпочтительно [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve). –
«Он разделен на две части и отправляется только первая половина». Почему вы не думаете, что это потому, что ваш код неверен? Потому что вы, безусловно, можете отправлять и получать сообщения с '\ 0', если у вас есть правильный код для этого. Но мы не можем указать на проблему, если мы не видим код. – kaylum
'strlen (data)' - ваша проблема. Как уже указывалось, вы не можете использовать любую строковую функцию, если ваши данные бинарны (а именно, если вы хотите включить '' 0 's в нее). Одно из возможных исправлений заключается в том, что функция 'send_data' принимает параметр длины. – kaylum