2016-06-28 3 views
0

Я использую этот код для получения данных от датчика через сокеты. Проблема в том, что я продолжаю получать одинаковый вывод для каждой итерации цикла for. Однако каждый раз, когда я запускаю код, я получаю другое число, но снова повторяется одно и то же число. Датчик должен отправлять разные данные каждый раз, но это не так.C++ сокет продолжает получать те же данные

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <netdb.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include "port.h" 

#define BUFSIZE 2048 

int 
main(int argc, char **argv) 
{ 
    struct sockaddr_in myaddr; /* our address */ 
    struct sockaddr_in remaddr; /* remote address */ 
    socklen_t addrlen = sizeof(remaddr);  /* length of addresses */ 
    int recvlen;   /* # bytes received */ 
    int fd;    /* our socket */ 
    int msgcnt = 0;   /* count # of messages we received */ 
    unsigned char buf[BUFSIZE]; /* receive buffer */ 


    /* create a UDP socket */ 

    if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { 
     perror("cannot create socket\n"); 
     return 0; 
    } 

    /* bind the socket to any valid IP address and a specific port */ 

    memset((char *)&myaddr, 0, sizeof(myaddr)); 
    myaddr.sin_family = AF_INET; 
    myaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    myaddr.sin_port = htons(SERVICE_PORT); 

    if (bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) { 
     perror("bind failed"); 
     return 0; 
    } 

    /* now loop, receiving data and printing what we received */ 

    printf("waiting on port %d\n", SERVICE_PORT); 
     printf("%s \n \n", "We recieve 10 packets just to confirm the communication"); 


    recvlen = recvfrom(fd, buf, BUFSIZE, 0, (struct sockaddr *)&remaddr, &addrlen); 
     if (recvlen > 0) { 
      buf[recvlen] = 0; 
      printf("received message: \"%u\" (%d bytes)\n", buf, recvlen); 
     } 
     else 
      printf("uh oh - something went wrong!\n"); 
     sprintf(buf, "ack %d", msgcnt++); 
     printf("sending response \"%u\"\n", buf); 
     if (sendto(fd, buf, strlen(buf), 0, (struct sockaddr *)&remaddr, addrlen) < 0) 
      perror("sendto"); 

    int temp = recvlen; 

    for (;;) { 

    recvlen = recvfrom(fd, buf, BUFSIZE, 0, (struct sockaddr *)&remaddr, &addrlen); 
    if (recvlen > 0) { 
      buf[recvlen] = 0; 
      printf("received message: \"%u\" (%d bytes)\n", buf, recvlen); 

    } 



} 
} 

Edit: Вот выход, когда я побежал код два отдельный раз: trial run и trial run 2

+0

Исправьте код вашего кода. Случайный случайный отступ делает ваш код почти невозможным для понимания. –

+0

извините за это! im с помощью кодовых блоков на ubuntu и ive так старался отступать, но он, похоже, не работает. спасибо за отзыв, хотя –

+0

Вам также нужно четко объяснить, в чем ваша проблема. Вы пишете, и я цитирую дословно: «Тем не менее, я получаю другое число за каждый раз, когда я запускаю код, но снова, тот же номер продолжает повторяться». Какой номер? Где этот номер? Разве каждый раз? Или это один и тот же номер каждый раз? Какой именно номер вы видите? Какой номер вы ожидаете увидеть? Почему вы ожидаете увидеть этот конкретный номер? Это совершенно непонятно. –

ответ

0

Я считаю, что проблема не с сетевым кодом, а с Е() звонки:

 printf("received message: \"%u\" (%d bytes)\n", buf, recvlen); 

Вы задающие %u распечатать содержимое buf, но ЬеЕ это символ rray (не целое число без знака), поэтому вы, вероятно, захотите использовать %s.

+0

Я уже пробовал это. Все, что я получаю, это "". Я рад, что связь сокетов правильная, хотя это означает, что проблема с датчиком может быть! если вы проверите пробные прогоны, даже если я получаю одинаковый номер каждый раз, но по какой-то причине размер отличается. –

+0

@ user3238603 Использование '% s' также является неисправным. Если вы прочитаете мои комментарии в главном разделе, '% s' остановится при первом вложенном нуле. Не используйте 'printf' - используйте ваш отладчик. Вы не печатаете все свои данные, поэтому вы не получаете вещи, чтобы соответствовать. – PaulMcKenzie

+1

Если вы получаете двоичные данные, вы должны перебрать байты и сделать что-то вроде 'printf («% 02x », buf [i])'. –

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