2016-06-28 46 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); 

    } 



} 
} 

编辑: 这是当我跑的代码两个不同的时间输出: trial runtrial run 2

+0

请修复您的代码的缩进。随机的,随意的缩进让你的代码几乎不可能理解。 –

+0

对不起!即时通讯使用codeblocks在Ubuntu和IVE试图很难缩进它,但它似乎并没有工作。感谢您的反馈,尽管 –

+0

您还需要清楚解释您的问题。你写道,我引用逐字:“然而,每次我运行代码时,我都会收到一个不同的数字,但同样的数字不断重复。”什么号码?那个号码在哪里?每次都不一样吗?或者每次都是一样的数字?你看到的数字究竟是什么?你期望看到什么号码?你为什么期望看到那个特定的数字?这完全是不可理解的。 –

回答

0

我相信这个问题是不是与你的网络代码,而是与你的printf()电话:

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

您指定%u打印出的buf内容,但BUF是一个字符一个rray(不是无符号整数),所以你可能想用%s代替。

+0

我已经试过了。我收到的是“”。我很高兴知道套接字通信是正确的,但这意味着问题可能与传感器有关!如果您检查试运行,即使我每次都收到相同的号码,但由于某种原因,尺寸不同。 –

+0

@ user3238603使用'%s'也有问题。如果您在主要部分阅读我的评论,'%s'将停在第一个嵌入的空值处。不要使用'printf' - 使用你的调试器。你没有打印所有的数据,这就是为什么你没有得到匹配的东西。 – PaulMcKenzie

+1

如果你收到二进制数据,你应该遍历这些字节并执行'printf(“%02x”,buf [i])''。 –