在C中使用setsockopt()读取()

时间:2012-09-15 19:22:46

标签: c setsockopt

我正在尝试编写服务器 - 客户端代码,而我却陷入了困境。我希望客户端读取一定的时间和超时。我尝试使用带有SO_RCVTIMEO的setsockopt()来指定timeval结构中的时间,但是我的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秒内超时。但它立即超时。我需要帮助!!!

1 个答案:

答案 0 :(得分:1)

如果read返回零,则表示连接已关闭。没有什么可以等待的,所以它不能等待。

此外,此代码已损坏:

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

您只能使用%s格式说明符来打印C样式的字符串。你使用它的方式,它无法知道要打印多少字节,因为它只在代码中的变量n中保存。