C突破无限循环winsock

时间:2017-05-15 20:02:49

标签: c loops winsock infinite winsock2

我正在使用C编写服务器客户端类型套接字通信程序。我正在使用winsock2.h,我正在尝试通过按键来实现断开客户端与服务器的连接方式。处理无限的代码部分就是这个。

while ( ( client = accept( server , ( SOCKADDR * ) &clientAddr , &clientAddrSize ) ) != INVALID_SOCKET) {

    // IP do cliente
    char *clientIP = inet_ntoa( clientAddr.sin_addr );
    IP_cliente = clientIP; // iguala a variável global, para ser acessível
    // em todo o lado

    // envia mensagem de boas vindas ao cliente
    serverWelcomeMsg( client , msg , log_server , clientIP );
    // Loop infinito, que correrá até o cliente desligar.   
    for (;;) {
        if ( _kbhit() ) break;
            // mete o buffer a 0's
            memset( buffer , 0 , sizeof( buffer ) );
            // recv_size = bytes recebidos
            int recv_size;
            recv_size = recv( client , buffer , BUFF_LEN , 0 );
            // se forem recebidos 0 bytes, o cliente desligou-se
            // o mesmo acontece se recv_size for igual a SOCKET_ERROR

            if ( recv_size == 0 ) {

                closesocket( server );
                sprintf_s( log_server , BUFF_LEN , "\t%s Ligacao terminada com %s\n" , Now() , clientIP );
                fprintf_s( serverLogFile , log_server );
                printf( "\n%s - Cliente desligou-se  \n" , Now() );
                return 0;

            }

            if ( recv_size == SOCKET_ERROR ) {

                closesocket( server );
                sprintf_s( log_server , BUFF_LEN , "\t%s Ligacao terminada com %s\n" , Now() , clientIP );
                fprintf_s( serverLogFile , log_server );
                printf( "\n%s - Cliente desligou-se  \n" , Now() );
                return 0;

            }

            else {

                // Adiciona um EOF no buffer para o transformar numa
                // string como deve de ser antes de imprimir
                buffer [ recv_size ] = '\0';

                if ( strcmp( buffer , "1" ) == 0 ) {

                    printf( "\n%s - A inserir Formando...\n" , Now() );
                    adicionarFormandoTelnet( client );
                    FileWriteFormandoXML( head );

                }

                if ( strcmp( buffer , "2" ) == 0 ) {

                    printf( "\n%s - A apagar formando...\n" , Now() );
                    head = deleFormandoTelnet( client , head );
                    FileWriteFormandoXML( head );

                }

                if ( strcmp( buffer , "3" ) == 0 ) {

                    printf( "\n%s - Apresentacao de lista de formandos...\n" , Now() );
                    displayFormandoTelnet( client );

                }
            }
        }


}

缓冲区的定义:

buffer = ( char ) malloc( (BUFF_LEN + 1) * sizeof( char ) );

0 个答案:

没有答案