3

これが私のコードです。

#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <stdio.h>
#include <string.h>

int max(int socket_handle[]);

int main( void )
{
   int       max_clients_allowed = 2;
   int       socket_handle[max_clients_allowed];
   int       client_handle[max_clients_allowed];
   struct    sockaddr_in6 server_address[max_clients_allowed];
   struct    sockaddr_in6 client_address[max_clients_allowed];
   char      buffer[1000];
   socklen_t client_length;
   fd_set    read_handles;
   struct    timeval timeout_interval;
   int       bytes_received;
   int       port_number = 9000;
   int       retval;
   int       i;


   printf("Hello, human.\n");

   for (i = 0; i < max_clients_allowed; i++)
   {
       printf("Creating socket%d on port: %d\n", i, port_number + i);
       socket_handle[i] = socket(PF_INET6,SOCK_DGRAM,0);
       memset( &server_address[i], 0, sizeof( server_address[i] ) );
       server_address[i].sin6_family = AF_INET6;
       server_address[i].sin6_addr=in6addr_any;
       server_address[i].sin6_port=htons( port_number + i );

       if(bind( socket_handle[i], (struct sockaddr *)&server_address[i], sizeof( server_address[i] )) < 0)
       {
           perror("Unable to bind.");
           return -1;
       }
       else
       {
           printf("Bind %d successful.\n", i);
       }

   }



   while (1) {

       FD_ZERO(&read_handles);
       FD_SET(socket_handle[0], &read_handles);
       FD_SET(socket_handle[1], &read_handles);
       timeout_interval.tv_sec = 2;
       timeout_interval.tv_usec = 500000;
       retval = select(max(socket_handle) + 1, &read_handles, NULL, NULL, &timeout_interval);
       if (retval == -1)
       {
           printf("Select error\n");
           //error
       }
       else if ((retval = 0))
       {
           printf("timeout\n");
       }
       else
       {
           //good
           client_length = sizeof(struct sockaddr*);
           for (i = 0; i < max_clients_allowed; i++)
           {
              if (FD_ISSET(socket_handle[i], &read_handles))
              {
                  if((bytes_received = recvfrom(socket_handle[i],buffer,sizeof(buffer),0,(struct sockaddr *)&client_address[i], (socklen_t*)&client_length)) < 0)
                  {
                     perror("Error in recvfrom.");
                     break;
                  }
                  printf("\nData received:");
                  printf("\n--------------\n");
                  printf("%s", buffer);
            }
           }
       }
   }
}

int max(int socket_handle[])
{
    if (socket_handle[0] > socket_handle[1])
    {
        return socket_handle[0];
    }
        return socket_handle[1];
}

このコードは、ポート 9000 および 9001 にバインドすることになっています。select を使用して、受信データがあるソケットを確認し、メッセージを出力します。

私の recvfrom 関数と関係があると思います。パラメータをいじってみましたが、役に立ちませんでした。

もう 1 つの問題は、sin6.addr = in6addr_any を使用してソケットをセットアップするときに発生する可能性があります。PF_INET6 と AF_INET6 が正しいと確信していますが、それも問題になる可能性があります。これで少し遊んでいますが、バグが見つかりません。誰かが私の間違いを指摘して修正できるようになれば、本当にありがたいです。私はこれを完成させようとしているのを知っています。

これは宿題の問題です。先生は私たちにテスト プログラムを渡してくれました。テスト プログラムはポート 9000 でメッセージを送信するだけです。

4

1 に答える 1

2

を呼び出すときに、入力時に を間違った値にrecvfrom()設定しています。代わりclient_lengthに設定する必要があります。また、を呼び出すたびsizeof(client_address[I])に をリセットする必要があります。client_lengthrecvfrom()

受信した を出力するときは、(クライアントが null で終わるデータを送信していない限り) バッファーが null で終了しないため、考慮するbuffer必要があります。bytes_received

代わりにこれを試してください:

#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <stdio.h>
#include <string.h>

int main( void )
{
    int       max_servers = 2;
    int       server_handle[max_servers];
    int       max_server_handle = 0;
    struct    sockaddr_in6 server_address[max_servers];
    struct    sockaddr_in6 client_address[max_servers];
    char      buffer[1000];
    socklen_t client_length;
    fd_set    read_handles;
    struct    timeval timeout_interval;
    int       bytes_received;
    int       port_number = 9000;
    int       retval;
    int       i;

    printf("Hello, human.\n");

    for (i = 0; i < max_servers; i++)
    {
        printf("Creating socket %d on port: %d\n", i, port_number + i);

        server_handle[i] = socket(PF_INET6, SOCK_DGRAM, 0);
        if (server_handle[i] < 0)
        {
            perror("Unable to create socket.");
            return -1;
        }

        if (server_handle[i] > max_server_handle)
            max_server_handle = server_handle[i];

        memset( &server_address[i], 0, sizeof( server_address[i] ) );
        server_address[i].sin6_family = AF_INET6;
        server_address[i].sin6_addr = in6addr_any;
        server_address[i].sin6_port = htons( port_number + i );

        if (bind( server_handle[i], (struct sockaddr *)&server_address[i], sizeof( server_address[i] )) < 0)
        {
            perror("Unable to bind.");
            return -1;
        }

        printf("Bind %d successful.\n", i);
    }

    while (1)
    {
        FD_ZERO(&read_handles);
        for (i = 0; i < max_servers; i++)
            FD_SET(server_handle[i], &read_handles);

        timeout_interval.tv_sec = 2;
        timeout_interval.tv_usec = 500000;

        retval = select(max_server_handle + 1, &read_handles, NULL, NULL, &timeout_interval);
        if (retval == -1)
        {
            printf("Select error\n");
            //error
        }
        else if (retval == 0)
        {
            printf("timeout\n");
        }
        else
        {
            //good
            for (i = 0; i < max_servers; i++)
            {
                if (FD_ISSET(server_handle[i], &read_handles))
                {
                    client_length = sizeof(client_address[i]);

                    if ((bytes_received = recvfrom(server_handle[i], buffer, sizeof(buffer), 0, (struct sockaddr *)&client_address[i], &client_length)) < 0)
                    {
                        perror("Error in recvfrom.");
                        break;
                    }

                    printf("\nData received on socket %d:", i);
                    printf("\n--------------\n");
                    printf("%.*s", bytes_received, buffer);
                }
            }
        }
    }
}
于 2013-03-07T00:36:01.737 に答える