2016-11-10 6 views
1

Я читаю сообщения переменных байтов из сокетов в 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. Следовательно, моя проблема.

+3

Являются ли данные, которые вы отправляете, текстовые или двоичные? Если вы отправляете двоичные данные, вы не можете использовать текстовые функции (например, 'strlen'). Гораздо больше, чем это невозможно сказать, не видя никакого кода, предпочтительно [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve). –

+0

«Он разделен на две части и отправляется только первая половина». Почему вы не думаете, что это потому, что ваш код неверен? Потому что вы, безусловно, можете отправлять и получать сообщения с '\ 0', если у вас есть правильный код для этого. Но мы не можем указать на проблему, если мы не видим код. – kaylum

+1

'strlen (data)' - ваша проблема. Как уже указывалось, вы не можете использовать любую строковую функцию, если ваши данные бинарны (а именно, если вы хотите включить '' 0 's в нее). Одно из возможных исправлений заключается в том, что функция 'send_data' принимает параметр длины. – kaylum

ответ

1

Предполагаю, что у вас есть доступ к серверному и клиентскому кодам.

Вы сказали, что вы знаете размер вашего сообщения, так что вы можете подготовить сообщение перед отправкой, ищет любой \0 характера и замены его замены уникальной последовательностью байт можно определить на стороне клиента, заменив его назад оригинальным персонажем.

1

Если ваша проблема вызвана целыми целыми числами непосредственно к массивам символов и их отправкой, я бы предложил написать целые числа в ostringstream (доступно в стандартной библиотеке C++), извлекая целые числа, вызвав метод ststringstreams str() , а затем отправку форматированных строк поверх вашего сокета. Это даст вам представление символов ваших целых чисел и должно исправить любые проблемы с форматированием.