Programar em Socket

25. Re: Programar em Socket

Alex Nunes
allex777

(usa Ubuntu)

Enviado em 26/05/2008 - 18:17h

blz! Mas quando testei com 2 computadores ponto a ponto não funcionou. como faço??


  


26. não funcionou?

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 26/05/2008 - 18:45h

como assim ? Qual problema ocorreu?
Infelizmente testei somente em uma maquina ela mesma sendo cliente e servidore. Desta maneira funcionou????
Qual problema ocorreu qdo tentou fazer com 2 maquinas???

Qto a troca de string, é só dar uma modificada no programa que não terá dificuldades em implementar troca de strings.


27. Re: Programar em Socket

Alex Nunes
allex777

(usa Ubuntu)

Enviado em 27/05/2008 - 12:29h

Utilizando a mesma máquina como cliente/servidor funcionou normalmente.


28. Re: Programar em Socket

Alex Nunes
allex777

(usa Ubuntu)

Enviado em 27/05/2008 - 12:31h

Quando tento rodar em máquinas diferente o cliente diz não achar o ip.

Coloquei o cabo cross. Depois coloquei a mesma faixa de ip e tentei conectar o cliente com o servidor.
Assim não deu certo!
Devo estar cometendo algum erro?


29. Re: Programar em Socket

Alex Nunes
allex777

(usa Ubuntu)

Enviado em 27/05/2008 - 12:33h

do jeito cru como ele ta ele faz a troca de string??
enviar um texto pelo cliente e o servidor receber o texto, certo??


30. então

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 27/05/2008 - 14:09h

ta estranho... deve ser algum problema de config de rede. O seu programa inicial funcionava? Eu testei aqui pela rede e ta funcionando... porém como aproveitei seu programa, vi que ele tem uns problemas de verificação dos buffers e tudo mais, pode ser isso, por algum motivo de rede lenta, não sei vou ver se dou uma olhada, tenta colocar diretamente o ip na hora de conectar e ver oque acontece.

Qto a string, se prestar atenção o programa troca strings, logico vc precisaria de alguma mudança pois ele espera um mini header e depois o conteudo, ai teria que ser uma coisa sem fim, ida e volta, mas é facil. No caso a propria transferência de arquivo é através de string e não do arquivo binário, as vantagens são:
- Lidar com texto é mto mais facil que com bytes (visto que byte 0 é final de string no C)
- Com UUEncode as linhas terão somente 62 colunas, ou seja, você pode ignorar linhas maiores que isso e assim evitar varios problemas de segurança, sem dizer que é mais facil controlar o buffer dinamico.
- Você pode implementar um CRC no UUEncode e assim verificar se o conteudo esta correto.
A unica desvantagem é que vai transmitir um pouco mais de dados, por isso pode não ser recomendado para arquivos mto grandes. Nos meus testes um zip de 120kb tornou-se 160kb em uuencode.

Boa sorte!


31. ah

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 27/05/2008 - 14:14h

o servidor tem de ser inicializado como root ou usando sudo.
Repito, o conteudo do programa é totalmente didático eu recomendaria reescrever do zero caso fosse fazer alguma coisa definitiva. Talvez de pra aproveitar a parte do uuencode dando alguma modificada, pois eu mesmo modifiquei esta que passei aqui da original que peguei na web.


32. comunicação cliente/servidor

Alex Nunes
allex777

(usa Ubuntu)

Enviado em 28/05/2008 - 00:37h

Consegui a comunicação cliente/servidor tive que colocar o ip das máquinas no arquivo hosts do ubuntu. Até ai blz!!


33. Problema.

Alex Nunes
allex777

(usa Ubuntu)

Enviado em 28/05/2008 - 00:53h

Pois então agora minha briga é:
Tenho um arquivo de substituição = subst.c este arquivo trabalha com "criptografia", (na verdade ele substitui letras através de vetores) ele troca as letras atraves de um arquivo subs.txt. Chama-se criptografia de Julio Cesar.

Meu cliente vai enviar uma string:
Exemplificando:
O cliente faria:
./cliente <nome-servidor> <porta> <dados>
./cliente "ip servidor" 2000 AAAA

O servidor receberia:
Servidor rodando seria:
./servidor 2000
Mensagem do Servidor:
Recebi a mensagem criptografada: XXXX
Em seguida diria:
A mensagem original enviada pelo cliente é: AAAA

Tipo, na hora da "criptografia" ele trocou o 'AAAA' pelo 'XXXX' (que foi criptografado no servidor), (criptografando) depois descriptografou mostrando 'AAAA' no servidor.

Se vc quiser te mando o código do subst.c junto com subs.txt que contém a troca das letras.

Tentei fazer por função mas não deu certo.




34. legal cara

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 28/05/2008 - 10:18h

só não entendi mto bem seu problema? Qual seria? Simplesmente por função que não funciona? Tal rotina é simples de implementar mas passa o código que vejo se acho o erro.
Abs


35. Re: Programar em Socket

Alex Nunes
allex777

(usa Ubuntu)

Enviado em 28/05/2008 - 12:21h

O Computador 1 (cliente) vai fazer o seguinte:
./cliente <ip-servidor> <porta> <dados>
./cliente 192.168.1.2 2000 AAAA
O cliente vai apenas enviar dados, no caso AAAA.
O Computador 2 (servidor) vai fazer o seguinte:
./servidor <porta>
./servidor 2000
Então o servidor vai mostrar a seguinte mensagem:
Recebi a mensagem criptografada: XXXX
Com o meu arquivo de criptografia o servidor vai pegar as letras enviadas pelo cliente e criptografar para XXXX (na verdade vai substituir a letra).
Depois ele vai mostrar a mensagem original:
A mensagem original descriptografada é: AAAA.

Vc entendeu?


36. subst.c

Alex Nunes
allex777

(usa Ubuntu)

Enviado em 28/05/2008 - 13:03h

#include <stdio.h>

int leDados(char *arqN, char *cri, char *decri)
{
FILE *arq;
int i;
char teste[26];
char buf[200];
char t1, t2;

/* Incializando o vetor de troca */
for (i = 0; i < 26; i++)
cri[i] = decri[i] = i;

if (!(arq = fopen(arqN, "r"))) {
fprintf(stderr, "ERRO leDados: nao posso abrir %s\n", arqN);
return (0);
}
/* Arquivo de dados deve ter linhas, primeira coluna a letra a ser trocada,
segunda coluna por qual ira trocar.

Exemplo:
A X
B Y
C J
...
*/

/* Vetor teste servira para detectar inconsistencia no arquivo de dados.
Em todos os vetores a posicao 0 eh a do 'A', a posicao 1 eh a do 'B' e assim
por diante.

Exemplo de uma inconsitencia:

A X
B K
C X

'C' nao pode ser substituido por 'X' pois o 'A' ja eh por 'X'!!!

Outro exemplo:
A X
B Y
A K

Duas vezes a letra 'A'.
Linhas inconsistentes serao IGNORADAS

O vetor teste guarda a linha do arquivo que tinha a letra. No inicio eh tudo zero
se para uma letra for diferente de zero eh porque uma linha anterior ja o definiu
*/
for (i = 0; i < 26; i++)
teste[i] = 0;


/* Lendo o arquivo */
i = 0; // qtd linhas do arquivo
while (fgets(buf, 100, arq)) {
if (feof(arq)) {
return (i);
}
i++;

/* Arquivo de dados podem conter linhas vazias ou comentarios (comecando com #) */
if ((buf[0] == '\n') || (buf[0] == '#'))
continue;

t1 = buf[0];
t2 = buf[2];

/* se nao eh letra MAIUSCULA, transforma em maiuscula */
if ((t1 >= 'a') && (t1 <= 'z'))
t1 = t1 - 32;
if ((t2 >= 'a') && (t2 <= 'z'))
t2 = t2 - 32;

/* Se nao eh letra, entao tem inconsistencia no arquivo de dados */
if ((t1 < 'A') || (t1 > 'Z')) {
fprintf(stderr,
"ERRO leDados: linha %i de %s nao esta correta\n", i,
arqN);
continue;
}
if ((t2 < 'A') || (t2 > 'Z')) {
fprintf(stderr,
"ERRO leDados: linha %i de %s nao esta correta\n", i,
arqN);
continue;
}
t1 = t1 - 'A';
t2 = t2 - 'A';

if (cri[t1] != t1) {
fprintf(stderr,
"ERRO leDados: letra %c na linha %i e na linha %i no arquivo %s\n",
t1 + 'A', teste[cri[t1]], i, arqN);
continue;
}
if (teste[t2]) {
fprintf(stderr,
"ERRO leDados: letra %c REPETIDA nas linhas %i e %i de %s\n",
t2 + 'A', teste[t2], i, arqN);
continue;
}
teste[t2] = i;
cri[t1] = t2;
decri[t2] = t1;
}
return (i);
}

char *troca(char *texto, char *troca)
{
char l, mi, id;
char *buf;

buf = texto;
for (; *buf; buf++) {
mi = 0;
l = *buf;
if ((l >= 'a') && (l <= 'z')) {
mi = 32;
}
if ((l < 'A') || (l > 'Z')) {
if (mi == 0) {
continue;
}
}
id = l - 'A' - mi;
l = troca[id];
*buf = l + 'A' + mi;
}
return (texto);
}

int main()
{
char cri[26], decri[26];
char texto[200];

leDados("subs.txt", cri, decri);

/* lendo algo do teclado para criptografar */
printf("Digite uma string para CIFRAR: ");
fgets(texto, 200, stdin);

printf("Original = %s", texto);

troca(texto, cri);
printf("Criptografado = %s", texto);

troca(texto, decri);
printf("Descriptografado = %s", texto);
}






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts