2016-06-28 73 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])''。 –