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