Shredder 0 Denunciar post Postado Maio 15, 2010 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
Fernando_ 0 Denunciar post Postado Maio 16, 2010 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
Shredder 0 Denunciar post Postado Maio 16, 2010 minha fonte de estudos é essa... http://www-usr.inf.ufsm.br/~giovani/sockets/sockets.txt vivaolinux tb tem bastante coisa.... Compartilhar este post Link para o post Compartilhar em outros sites
Fernando_ 0 Denunciar post Postado Maio 17, 2010 Bacana este site cara. Valeu mesmo. Compartilhar este post Link para o post Compartilhar em outros sites
Shredder 0 Denunciar post Postado Maio 19, 2010 alguem pode me ajudar???? porque eu ja vi que nao funcionaria com o SCANF pois ele só captura uma palavra... Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Maio 19, 2010 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
Renato Lima 0 Denunciar post Postado Maio 19, 2010 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
Shredder 0 Denunciar post Postado Maio 19, 2010 pois eh exatamente amigo renato. vou ver se funciona melhor c/ gets.. obrigado ai Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Maio 20, 2010 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
Shredder 0 Denunciar post Postado Maio 22, 2010 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
_Isis_ 202 Denunciar post Postado Maio 22, 2010 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