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); 

    } 



} 
} 

:)( trial runtrial run 2

+0

コードのインデントを修正してください。無作為な、無意味な字下げは、コードをほとんど理解できないようにします。 –

+0

ごめんなさい!私はubuntuとiveでコードブロックを使用してそれをインデントするのが大変でしたが、うまくいかないようです。しかし、フィードバックのためにありがとう –

+0

あなたはまたあなたの問題が何であるかを明確に説明する必要があります。あなたは書いていますが、私はそのまま言います。「しかし、コードを実行するたびに別の番号を受け取りますが、同じ番号が繰り返されます。何番?その番号はどこですか?毎回違うの?それとも毎回同じ番号ですか?あなたが見ている番号は何ですか?何番目に見えますか?なぜあなたはその特定の数字を見たいと思いますか?これはまったく理解できません。 –

答えて

0

が、私は問題があなたのネットワーキングのコードではなく、むしろ、あなたのprintfと信じている:ここで は、私は、コード2別々回走った出力であります通話:

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

あなたはbufの内容をプリントアウトする%uを指定しているが、bufが文字aはrray(符号なし整数ではない)なので、おそらく%sを代わりに使用したいと考えています。

+0

私はすでにそれを試みました。私が受け取るのはすべて ""です。私はソケット通信が正しいことを知ってうれしいですが、それは問題がセンサーである可能性があることを意味します!あなたが毎回同じ番号を受け取ったにもかかわらず、トライアルが実行されるのをチェックすると、サイズは何らかの理由で異なってしまいます。 –

+0

@ user3238603 '%s'を使うことも失敗です。メインセクションで自分のコメントを読んだら、 '%s'は最初の埋め込みヌルで停止します。 'printf'を使わないでください - あなたのデバッガを使いましょう。すべてのデータを印刷しているわけではありません。そのため、一致するものが得られないのです。 – PaulMcKenzie

+1

バイナリデータを受け取った場合は、そのバイトをループして 'printf("%02x "、buf [i])'のようにしてください。 –

関連する問題