Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C突破无限循环winsock_C_Loops_Winsock_Infinite_Winsock2 - Fatal编程技术网

C突破无限循环winsock

C突破无限循环winsock,c,loops,winsock,infinite,winsock2,C,Loops,Winsock,Infinite,Winsock2,我正在用C编写一个服务器-客户机类型的套接字通信程序。我正在使用winsock2.h,我正在尝试实现一种方法,通过按键断开客户机与服务器的连接。处理无限的代码部分如下所示 while ( ( client = accept( server , ( SOCKADDR * ) &clientAddr , &clientAddrSize ) ) != INVALID_SOCKET) { // IP do cliente char *clientIP = inet_nt

我正在用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 ) );

有两种担心……”memset(buffer,0,sizeof(buffer));'-这是对自行车的浪费。”缓冲区[recv_size]='\0';'-一个比memset更好的计划,前提是“buffer”的声明大小为“BUFF\u LEN+1”,否则收到所有“BUFF\u LEN”字节将导致NUL的绑定外写入:(
fprintf\u s(serverLogFile,log\u server);
%
出现在
log\u服务器中时,
是坏的。
fprintf(serverLogFile,“%s”,log_server);
fputs(log_server,serverLogFile);
Post-definition of
buffer[]
…总之,你的实际问题是什么?除了构建一个可以同时处理多个客户机的“真正”服务器外,我建议你尝试从一个关闭“客户机”套接字的键盘读取线程中线程,从而强制执行recv()我知道一个真正的服务器可以处理多个连接,但是这个任务明确地说服务器应该只处理一个连接。