0

サーバーとクライアントのコードを書こうとしていて、ある時点で立ち往生しています。クライアントに一定時間読み取りとタイムアウトをさせたい。timeval 構造体で時間を指定する SO_RCVTIMEO で setsockopt() を使用しようとしましたが、私の read() は timeval 構造体で指定した時間を待ちません。つまり、setsockopt() の後に read() を使用した場合、read() は指定された時間だけ待機しています。最初に write() を呼び出してから read() を呼び出すと、read() 関数は、timeval 構造体で指定された時間を待たずにすぐにタイムアウトします。私のコードを以下に示します。

// サンプル クライアント コード

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<netdb.h>


    void error(char *msg)
    {
        perror(msg);
        exit(1);
    }

    int main(int argc, char *argv[])
    {
        int a=1;
        fd_set readfds,writefds;
        int ready_for_reading,reading;
        struct timeval time_out;

        int sockfd,newsockfd,portno,n;
        struct sockaddr_in serv_addr;
        struct hostent *server;
    //  server=gethostbyname(argv[1]);
        char buffer[256];
        portno=atoi(argv[2]);
        sockfd=socket(AF_INET,SOCK_STREAM,0);
        server=gethostbyname(argv[1]);
        serv_addr.sin_family=AF_INET;
        serv_addr.sin_port=htons(portno);
        bcopy((char *)server->h_addr,
            (char *)&serv_addr.sin_addr.s_addr,
            server->h_length);
        time_out.tv_sec = 15;    // 15 seconds
            time_out.tv_usec = 0;    // 0 milliseconds

    //  sockfd=socket(AF_INET,SOCK_STREAM,0);
        if(sockfd==-1)
            error("\nError creating socket");
    //      if(setsockopt (sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&time_out, sizeof (time_out)))
    //               error("\n\tsetsockopt function has a problem\n");

        n=connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));
        if(n==-1)
            error("\nError connecting to server");
        printf("\nEnter client's msg:");
        fgets(buffer,255,stdin);
        n=write(sockfd,buffer,strlen(buffer));
        if(n<0)
            error("\nMsg not written to server");
        if(setsockopt (sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&time_out, sizeof(time_out)))
            error("\n\tsetsockopt function has a problem\n");

    //  FD_ZERO(&readfds);
    //  FD_SET(sockfd,&readfds);

        n=read(sockfd,buffer,255);
    //  ready_for_reading=select(sockfd,&readfds,NULL,NULL,&time_out);
    //  printf("\nready_for_reading=%d",ready_for_reading);
    /*  if (ready_for_reading)
            {
              //  reading = read(newsockfd, buffer, 255);
                printf("Read, %d bytes from input : %s \n", n,buffer);
            }
            else
            {
                printf(" 10 Seconds are over - no data input \n");
                return 0;
            }
    */
        if(n<0)
            printf("\nMsg not read from server");
        if(n==0)
        {
            printf("\n No ack from server");
            return 0;
        }
        printf("\nServer's ack:%s\n",buffer);

    /*  if (ready_for_reading) 
        {
            //  reading = read(newsockfd, buffer, 255);
                printf("Read, %d bytes from input : %s \n", n,buffer);
            } 
        else 
        {
                    printf(" 10 Seconds are over - no data input \n");
            return 0;
            }
    */
        return 0;
    }   

上記のコードでは、read() 操作を 15 秒でタイムアウトさせたいと考えています。しかし、すぐにタイムアウトします。私は助けが必要です!!!

4

1 に答える 1

1

readゼロを返す場合は、接続が閉じていることを意味します。待つものがないので、待つことはできません。

また、このコードは壊れています:

    printf("\nServer's ack:%s\n",buffer);

フォーマット指定子を使用して使用できるのは%s、Cスタイルの文字列のみです。nこれまでの使用方法では、コードのこの時点で変数に保持されているだけなので、印刷するバイト数を知る方法はありません。

于 2012-09-15T20:54:18.607 に答える