Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Shredder

Cliente e servidor em c

Recommended Posts

fala galera

 

beleza??? Tenho uma duvida... eu tenho que fazer esses dois arquivos conversarem e ao se clicar "\q" termine a conexão(feche).

 

segue arquivos que fiz funcionando

 

Servidor.c

 

/* 
 * 	Bibliotecas Padrões que devem ser incluidas
 */
#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>

/*
 * 	Função Principal
 */
int main (int argc, char * argv[])
{
	int			sock,
				length;
	struct sockaddr_in	server,
				client;
	int			connected,
				validacao;
	char			t[30],
				c,
				resp;
	FILE			*fp,
				*x;
	
	/*
 * 	Testa quantos argumentos existem na linha de comando
 */
	if (argc != 3)
	{
		printf("Utilização: socket porta lista_de_espera\n");
		exit(EXIT_FAILURE);
	}
	/*
 * 	Cria o descritor do socket e testa se conseguiu
 */
	if ((sock = socket(AF_INET,SOCK_STREAM,0))==-1)
	{
		printf("Erro ao criar o socket\n");
		exit(1);
	}
	/*
 * 	Preenche os demais campos necessários para se conectar
 * 	ao servidor, primeiramente o tipo de conexão (INTERNET)
 */
	server.sin_family = AF_INET;
	/*
 * 	Peenche o endereço do servidor
 */
		server.sin_addr.s_addr = htonl (INADDR_ANY);


	/* 	e depois especifica o número da porte que se tentar conectar
 * 	ao servidor
 */
	server.sin_port = htons(atoi(argv[1]));
	
	/*	
 *	Associacao do numero da porta com o socket e o teste
 */	
	if (bind(sock,(struct sockaddr *)&server,sizeof(server)) == -1)
	{
		printf("Erro no bind!\n");
		exit(1);
	}
	/*	
 *	Imprime na tela do servidor o num da porta
 */	
	printf("Socket port #%d\n",ntohs(server.sin_port));
	/*
 * 	Espera por tentativas de conexao do cliente e 
 * 	maximo de requisicoes de espera
 */	
	listen(sock,atoi(argv[2]));
	length = sizeof (client);
	printf("Esperando conexao...\n");
	/*
 * 	Aceita a tentativa de conexao do cliente
 */
	connected = accept(sock, (struct sockaddr *)&client,&length);
	printf("Conectou 1 cliente....\n");
	/*
 * 	A partir deste ponto o cliente já está em comunicação com o
 * 	servidor através do socket ---> sock
 */
 
	/*
 * 	Insira neste ponto todo o código necessário para a comunicação
 * 	cliente/servidor
 */
	
	/* 	
 * 	Le e escreve pelo socket 
 */
	resp ='A';

	/*	
 *	O cliente lê do servidor um caracter
 */
	validacao = write (connected, (void *) &resp, 1);
	/*
 * 	Ecoa no terminal do cliente o caracter recebido do servidor
 */
	printf("\nConsegui escrever para o cliente o caracter: %c\n\n",resp);
	
	/*	
 *	O cliente escreve no servidor uma string de 30 caracteres
 */
	validacao = read (connected, (char *) t, 30);
	/*
 * 	Ecoa no terminal do cliente a string enviada para o servidor
 */
	printf("\nConsegui ler do cliente a string: %s\n",t);
}

Cliente.c

 

/* 
 * 	Bibliotecas Padrões que devem ser incluidas
 */
#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>

/*
 * 	Função Principal
 */
int main (int argc, char * argv[])
{
	int			sock;
	struct sockaddr_in	server;
	struct hostent		*hp,
				*gethostbyname();
	int			validacao;
	char			t[30]="Será que vai funcionar",
				c,
				resp,
				enc = 'f';
	FILE			*fp,
				x;
	
	/*
 * 	Testa quantos argumentos existem na linha de comando
 */
	if (argc != 3)
	{
		printf("Utilização: cli host porta\n");
		exit(EXIT_FAILURE);
	}
	/*
 * 	Cria o descritor do socket e testa se conseguiu
 */
	if ((sock = socket(AF_INET,SOCK_STREAM,0))==-1)
	{
		printf("Erro ao criar o socket\n");
		exit(1);
	}
	/*
 * 	Obtêm através do retorno da funções abaixo uma estrutura
 * 	de dados a partir do nome do host, recebido como primeiro 
 * 	parâmetro após o nome do módulo
 */
	hp = gethostbyname (argv[1]);
	/*
 * 	Forma a partir da estrutura de dados acima o endereço IP
 * 	para realizar a conexão com o servidor
 */
	memcpy ((char*)&server.sin_addr, (char*)hp->h_addr, hp->h_length);
	/*
 * 	Preenche os demais campos necessários para se conectar
 * 	ao servidor, primeiramente o tipo de conexão (INTERNET)
 */
	server.sin_family = AF_INET;
	/* 	e depois especifica o número da porte que se tentar conectar
 * 	ao servidor
 */
	server.sin_port = htons(atoi(argv[2]));
	
	/*
 * 	Tenta conectar-se ao servidor, utilizando a variável
 * 	server 
 */
	if ( connect(sock, (struct sockaddr *)&server, sizeof (server) ) == -1)
	{
		printf("\nErro de conexção com o servidor através de Socket\n");
		exit(1);
	}
	/*
 * 	A partir deste ponto o cliente já está em comunicação com o
 * 	servidor através do socket ---> sock
 */

	/*
 * 	Insira neste ponto todo o código necessário para a comunicação
 * 	cliente/servidor
 */

	/*	
 *	O cliente lê do servidor um caracter
 */
	validacao = read (sock, (char *) &resp, 1);
	/*
 * 	Ecoa no terminal do cliente o caracter recebido do servidor
 */
	printf("\nConsegui ler do servidor o caracter: %c\n\n",resp);

	/*	
 *	O cliente escreve no servidor uma string de 30 caracteres
 */
	validacao = write (sock, (void *)t, 30);
	/*
 * 	Ecoa no terminal do cliente a string enviada para o servidor
 */
	printf("\nConsegui escrever para o servidor a string: %s\n",t);
}

 

Tipo um bate-papo mesmo.. msn, etc..

 

Grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa Noite man,

 

Desculpa por invadir o tópico com oura dúvida,

Não entendo nada disso, mas gostaria de entender,

Voce teria alguma dica pra alguêm que quer aprender isso?

Seja livros (preferência em portugês, meu inglês está ruim ainda), sites, e-books, etc.

Valeu =D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bacana este site cara.

Valeu mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O scanf lê o que você quiser!

Procure no fórum, ja houveram inúmeras discussões sobre leitura com scanf.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se for uma string você pode usar o gets. Ex:

 

char string[100];

printf("Digite o seu nome: ");

gets(string);

 

O scanf lê apenas a primeira cadeia de caracteres, ou seja, lê somente o que vier antes de primeiro espaço " ".

 

T+

Compartilhar este post


Link para o post
Compartilhar em outros sites

O scanf lê apenas a primeira cadeia de caracteres, ou seja, lê somente o que vier antes de primeiro espaço

 

Não.

A tag '%s' lê até encontrar um espaço.

Experimente scanf("%[^\n]%*c", &str) para ver o que acontece.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A função gets não funciona do modo que deveria....

já diz na descrição dele no MAN

gets() reads a line from stdin into the buffer pointed to by s until either a terminating newline or EOF, which it replaces with '\0'(fim de linha). No check for buffer overrun is performed (see BUGS below).

como diz acima, ele lê mas não checa o tamanho do buffer.

sem contar que ele pede pelo amor de Deus para você não usar essa função. hehehehe

 

 

Estou aqui arrumando outra solução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui falamos pra todos os ventos "não use gets" e apontamos um tópico sobre fgets.

Às vezes, o próprio compilador ou a manpage indica o fgets também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.