1

メインから setup_udp_socket メソッドを呼び出して、udppport に UDP ソケットをセットアップし、このソケットで select を使用しています。このメソッドで何かを読み取る必要がある場合、udp_communication () を呼び出しますが、奇妙な出力が表示されます

[受信したメッセージはありません。つまり、0 バイトですが、char 配列の strlen は 1 です]。UDP パケットは、私がアクセスできない別の Java プログラムによって送信されます。私は nc を使用し、正常に動作することをテストしました。しかし、私のコードには私が理解できない問題があるようです。

私は待っています

リスナー: 127.0.0.1 およびポート番号:48555 からパケットを取得しました

受信したメッセージ: バイト数: 0 len: 1

udp_communication を終了しています

int setup_udp_socket(char* udpport)
{
        struct addrinfo hints, *servinfo, *p;
        int ret_value;

        memset(&hints, 0, sizeof hints);
        hints.ai_family = AF_INET;
        hints.ai_socktype = SOCK_DGRAM;
        hints.ai_flags = AI_PASSIVE;

        if ((ret_value = getaddrinfo("127.0.0.1", udpport, &hints, &servinfo)) != 0) {
                fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret_value));
                exit(FAILED);
        }

        for(p = servinfo; p != NULL; p = p->ai_next) {
                if ((udp_sock = socket(p->ai_family, p->ai_socktype,
                                     p->ai_protocol)) == -1) {
                        perror("udp: socket creation failed");
                        continue;
                }

                if (bind(udp_sock, p->ai_addr, p->ai_addrlen) == -1) {
                        close(udp_sock);
                        perror("udp: bind");
                        continue;
                }
                //listen(udp_sock, 20);

                break;
        }

        if (p == NULL) {
                if (servinfo != NULL)
                    freeaddrinfo(servinfo);
                exit(FAILED);
        }

        freeaddrinfo(servinfo);
        printf("udp: waiting to recvfrom and udpport :%s\n", udpport);

}

//udp_recvbuf は 1024 バイトの char 配列です。

void udp_communication() {

        struct sockaddr_storage addr;
        socklen_t addr_len;
        char s[INET6_ADDRSTRLEN];
        int n;
        addr_len = sizeof(addr);
        //udp_sock_flag = fcntl(udp_sock, F_GETFL, 0);
        //fcntl(udp_sock, F_SETFL, udp_sock_flag | O_NONBLOCK);


//       while(1) {

        memset(udp_recvbuf, '\0', BUFFERSIZE);
        printf("I am waiting\n");
        if (n = recvfrom(udp_sock, udp_recvbuf, 1023 , 0, (struct sockaddr *)&addr, &addr_len) == -1) {
                perror("recvfrom");
                exit(1);
        }
         printf("listener: got packet from %s and port number :%d\n ",
        inet_ntop(addr.ss_family,
            get_in_addr((struct sockaddr *)&addr),
            s, sizeof s), ((struct sockaddr_in *)&addr)->sin_port);
          printf("Message received:%s number of bytes : %d len: %d\n", udp_recvbuf, n, strlen(udp_recvbuf));

//      } 


        printf("Exiting udp_communication\n");

        //pthread_exit(NULL);

}
4

0 に答える 0