C突破无限循环winsock
我正在用C编写一个服务器-客户机类型的套接字通信程序。我正在使用winsock2.h,我正在尝试实现一种方法,通过按键断开客户机与服务器的连接。处理无限的代码部分如下所示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
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 ofbuffer[]
…总之,你的实际问题是什么?除了构建一个可以同时处理多个客户机的“真正”服务器外,我建议你尝试从一个关闭“客户机”套接字的键盘读取线程中线程,从而强制执行recv()我知道一个真正的服务器可以处理多个连接,但是这个任务明确地说服务器应该只处理一个连接。