Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda Em Programa Em C (linux)


dtsv

Pergunta

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...