如何使用scanf保持程序运行

时间:2014-08-26 08:37:28

标签: c sockets tcp scanf interruption

我想找到一种退出问题"循环的方法" (见下文)保持程序运行,我的意思是:在程序中必须有消息:"准备发送信息,退出停止!"如果用户没有键入exit,程序必须仍然运行而不等待用户单击一个字符然后输入。必须连续发送信息,直到用户键入exit退出程序。

我希望我能很好地解释这个问题,并且我确信有一个简单的解决方案

提前感谢您的帮助

do
{

    /* menu */
    printf("\r\n");
    printf("1 : Start, Sending Informations.\r\n");
    printf("2 : Quit.\r\n");
    printf("choice : ");
    scanf("%d", &nChoice);

    printf("\n Trying to do a connection \n \r");

    /* if connection is not established, call accept, TCP SERVER */
    if (fd_client == -1)
    { 
        printf("ready to accept...\n");             
        fd_client = accept(fd_listen, (struct sockaddr*)&client_addr, &addrlen);

        if (fd_client >= 0) 
        {
            printf("accept: %s, port %d\r\n", inet_ntoa(client_addr.sin_addr), htons(client_addr.sin_port));
        }
    }

    if (fd_client < 0) 
    {
        printf(" connection is not established, continue to accept\n");

        /*connection is not established, continue to accept*/
        continue;               
    }

    FD_ZERO(&rfd);
    FD_ZERO(&wfd);
    FD_ZERO(&efd);
    FD_SET(fd_tty, &rfd);
    FD_SET(fd_client, &rfd);
    maxfd = (fd_tty > fd_client ? fd_tty : fd_client) + 1;

    /*connection is established, call select to see if any data arrived from the GPS*/
    printf("connection is established, seeing if any data arrived\n");

    char chaine1[256];
    char chaine2[] = "exit";
    int i;

    if (nChoice == 1)
    {  
        do // THE LOOP IN QUESTION
        { 
            printf("preparing to send informations, exit to stop !\n");
            i = strcmp(chaine1, chaine2); // Building the condition to exit
            scanf("%s", chaine1);
            fflush(stdin);
            // printf ("i= %d\n",i); 

            ret = select(maxfd, &rfd, &wfd, &efd, &tm);

            if (ret < 0) // Select failed 
            { 
                printf("select fail\r\n");
                break;
            } 
            else if (ret == 0) 
            {
                continue;   /*no data arrived, continue to call select*/
            }
            else 
                printf("data is arriving \n");

            if (FD_ISSET(fd_tty, &rfd)) /*tty port has data to be read*/
            {
                ret = read(fd_tty, buf, sizeof(buf));

                if (ret <= 0) 
                {
                    printf("read tty port fail\r\n");
                    break;
                }

                if (send(fd_client, buf, ret, 0) < 0) /*send data to ethernet*/
                {   
                    printf("send to ethernet fail\r\n");
                    break;              
                }
            }

            if (FD_ISSET(fd_client, &rfd)) /*tcp client has data to be read*/
            { 
                ret = recv(fd_client, buf, sizeof(buf), 0);

                if (ret < 0) 
                {
                    printf("read from ethernet fail\r\n");
                    break;
                } 
                else if (ret == 0) 
                {
                    printf("disconnect by remote\r\n");
                    close(fd_client);
                    fd_client = -1;
                    continue; /*continue to accept...*/
                }

                if (write(fd_tty, buf, ret) < 0) /*send data to tty port*/
                {       
                    printf("write to tty fail\r\n");
                    break;              
                }
            }

        } while (i != 0 ); // The exit condition
    }
} while(nChoice != 2);

2 个答案:

答案 0 :(得分:0)

你可以做的简单事情就是等待超时。但是scanf你不能这样做,所以你可以在select()stdin的活动进行{{1}}调用,如果在那段时间内没有事件,则继续。

请检查以下链接 http://cboard.cprogramming.com/c-programming/96544-unblock-scanf-call.html

希望这有帮助。

答案 1 :(得分:0)

我认为应该注意fflush();是为输出流而设计的,在输入流上使用时是未定义的,解决问题的一种方法是scanf(" %s", chaine1);或创建一个清除输入的函数缓冲液中。