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));
Pergunta
dtsv
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);
}
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.