2013-09-12 2 views
0

У меня есть сервер, написанный на C/C++, а клиент находится на Java, который работает на android.Socket Получение неправильных данных

Сервер выглядит как сервер

C++

#define ETH_DATA_LENGTH 25 

bzero(buf,ETH_DATA_LENGTH); 
rd=read(newsockfd,buf,ETH_DATA_LENGTH); 

     if(rd>0){ 
     printf("received %s\n", buf); 
     char cmd[ETH_DATA_LENGTH]={0}; 
     sprintf(cmd,"%s",buf); 
     //setCommand(cmd); 
     } 

Андроида клиент посылает пакет данных формата 5_11_14_, 5_11_15_, 5_11_16_,etc... и сервер получает данные правильно, если есть задержка в стороне клиента с в каждом пакет. Но когда клиент постоянно посылать я получаю некоторый дополнительный характер и выглядят как

received 5_11_9_ 

received 5_11_10_ 
5_11_11_ 
5_11_12�ڳ 
received _ 

received 5_11_13_ 

А на андроид стороне я посылаю данные как

Java клиент

PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(clientsocket.getOutputStream())),true); 
out.println(str); 

Любая идея почему это происходит?

Заранее спасибо ....

+0

Вы не прекратили свой буфер перед тем, как использовать его в виде строки, так как ваше чтение может перезаписать последний ноль. Кроме того, вы не можете ожидать, что данные выйдут из стороны приема TCP обязательно в тех же размерах, что и на стороне передачи. –

+2

25 слишком мал, длина «5_11_10_ \ r5_11_11_ \ r5_11_12» равна 25. Вам нужно изменить строку на 'rd = read (newsockfd, buf, ETH_DATA_LENGTH - 1);' – ZijingWu

+0

@ ZijingWu На самом деле клиент отправляет данные, такие как 5_11_14_, а затем 5_11_15_ и т. Д. – Haris

ответ

4

Пару вещей: Данные, которые вы получаете не нулю прекращается, другими словами, вы не можете использовать его как строку. Другое дело, что когда вы просите читать 25 байт, он может читать до 25 байт или менее. Вам нужно либо иметь какой-то разделитель записи, либо отправить длину заранее.

Проблема, которую вы видите («мусор») из-за первого. printf будет просто извлекать символы от buf до тех пор, пока не ударит символ символа конца строки '\0'. Если он не найден, то printf будет просто продолжать, даже считывая символы, выходящие за пределы вашего буфера.

Простое решение этой проблемы заключается в увеличении размера буфера на единицу (чтобы соответствовать терминатор), получают один меньше байт, чем размер буфера (например, sizeof(buf) - 1), и после преуспевающим read вызова прекращается ввод:

buf[rd] = '\0'; 
+0

Привет, спасибо за ответ. Итак, как я могу преодолеть эту ситуацию ... Я просто хочу избежать значения мусора ... – Haris

+0

@Haris Просто добавил решение –

Смежные вопросы