Boa tarde a todos  Estou com uma pequena duvida que espero que vocês possam me ajudar, vamos lá Estou fazendo um codigo de troca de mensagens de um cliente para um servidor, o servidor se conecta aguarda, o cliente se conecta e envia uma mensagem para o servidor e entra em espera, ai o servidor envia uma mensagem para o cliente e entra em estado de espera. Como se fosse um walk talk, enquanto um fala o outro espera. E termina quando um deles digita cambio desligo. Agora eu pergunto qual a alteração que eu teria que fazer para que tanto o cliente como o servidor pudessem ficar falando e só parassem de falar quanto eu digitasse cambio. Ex: O cliente esta falando: cliente falando... cliente falando... cliente falando... cambio ai o servidor recebe as mensagens e começa a falar e também só para quando for digitado cambio, e ai o cliente volta a falar. E ambos seriam fechados com cambio desligo. Segue os codigos abaixo: /*	servidor  */ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <arpa/inet.h> #include <signal.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <limits.h>  #define LINHA	200  int	le_esvaziando_buf_teclado (char *f, int t) { 	char * anda = f; 	 	for (*anda=getc(stdin);	 			(  anda < (f+t-1)) &&  				( (*anda) != '\n') ;  					(*anda)=getc(stdin) ) 	{ 		anda++;	}  	(*anda) = '\0';  	 	__fpurge(stdin); 	 	return(anda - f); }  int main (int argc, char * argv[]) { 	int			sock, 				length; 	struct sockaddr_in	server, 				client; 	int			connected, 				validacao; 	char			t[LINHA]="algo", 				c[7]="cambio", 				resp; 	FILE			*fp, 				*x; 	 	 	if (argc != 3) 	{ 		printf("Utilização: socket porta lista_de_espera\n"); 		exit(EXIT_FAILURE); 	} 		 	if ((sock = socket(AF_INET,SOCK_STREAM,0))==-1) 	{ 		printf("Erro ao criar o socket\n"); 		exit(1); 	} 	 	server.sin_family = AF_INET; 	 		server.sin_addr.s_addr = htonl (INADDR_ANY);  	server.sin_port = htons(atoi(argv[1])); 			 	if (bind(sock,(struct sockaddr *)&server,sizeof(server)) == -1) 	{ 		printf("Erro no bind!\n"); 		exit(1); 	} 		 	printf("Socket port #%d\n",ntohs(server.sin_port)); 		 	listen(sock,atoi(argv[2])); 	length = sizeof (client); 	printf("Esperando conexao...\n"); 	 	connected = accept(sock, (struct sockaddr *)&client,&length); 	printf("Conectou 1 cliente....\n"); 	 	while ( strcmp(t,"cambio desligo") != 0) 	{ 		validacao = read  (connected,  (char *) t, LINHA); 		printf("MSG Recebida:%s\n",t); 		validacao = read  (connected, (char *) c, 15); 		if( strcmp(c,"cambio") != 0) 		{ 			printf("Falha no protocolo!!!!!\n"); 			printf("\t\t\nAcesso Negado!!!!!\n"); 			exit(-1); 		} 		else 			printf("MSG Recebida:%s\\n",c);  		if ( strcmp(t,"cambio desligo") != 0) 		{ 			printf("Digite algo a transmitir:"); 			le_esvaziando_buf_teclado(t,LINHA); 			validacao = write  (connected,  (void *) t, LINHA); 			printf("MSG Transmitida:%s\n",t); 			validacao = write  (connected, (void *) c, 15); 			printf("MSG Transmitida:%s\\n",c); 		} 	} 	close(sock); 	close(connected); }   /*	cliente    */  #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <arpa/inet.h> #include <signal.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <limits.h>  #define LINHA	200  int	le_esvaziando_buf_teclado (char *f, int t) { 	char * anda = f; 	 	for (*anda=getc(stdin); 				(  anda < (f+t-1)) &&  				( (*anda) != '\n') ;  					(*anda)=getc(stdin) ) 	{ 		anda++; 	}  	(*anda) = '\0'; 	 	__fpurge(stdin); 	 	return(anda - f); }  int main (int argc, char * argv[]) { 	int			sock; 	struct sockaddr_in	server; 	struct hostent		*hp, 				*gethostbyname(); 	int			validacao; 	char			t[LINHA]="Será que vai funcionar", 				c[7]="cambio", 				resp, 				enc = 'f'; 	FILE			*fp, 				x; 	 	 	if (argc != 3) 	{ 		printf("Utilização: cli host porta\n"); 		exit(EXIT_FAILURE); 	} 	 	if ((sock = socket(AF_INET,SOCK_STREAM,0))==-1) 	{ 		printf("Erro ao criar o socket\n"); 		exit(1); 	} 	 	hp = gethostbyname (argv[1]); 	 	memcpy ((char*)&server.sin_addr, (char*)hp->h_addr, hp->h_length); 	 	server.sin_family = AF_INET; 	 	server.sin_port = htons(atoi(argv[2])); 		 	if ( connect(sock, (struct sockaddr *)&server, sizeof (server) ) == -1) 	{ 		printf("\nErro de conexão com o servidor através de Socket\n"); 		exit(1); 	} 	 	while ( strcmp(t,"cambio desligo") != 0) 	{ 		printf("Digite algo a transmitir:"); 		le_esvaziando_buf_teclado(t,LINHA); 		validacao = write  (sock,  (void *) t, LINHA); 		printf("MSG Transmitida:%s\n",t); 		validacao = write  (sock, (void *) c, 15); 		printf("MSG Transmitida:%s\\n",c);  			  		if( strcmp(t,"cambio desligo") != 0) 		{ 			validacao = read  (sock,  (char *) t, LINHA); 			printf("MSG Recebida:%s\n",t); 			validacao = read  (sock, (char *) c, 15); 			printf("MSG Recebida:%s\\n",c); 			if( strcmp(c,"cambio") != 0) 			{ 				printf("Falha no protocolo!!!!!\n"); 				printf("\t\t\nAcesso Negado!!!!!\n"); 				exit(-1); 			} 		} 	} 	close(sock); }