Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Flames

contador em socket

Mensagens Recomendadas

Flames

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <netdb.h>
#include <string.h>
#define SERVER_PORT 8000 
#define BUF_SIZE 1024


void process_client(int fd);
void erro(char *msg);
int d=-1;
int main() {

int fd, client;
struct sockaddr_in addr, client_addr;
int client_addr_size;

bzero((void *) &addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(SERVER_PORT);
if ( (fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
erro("na funcao socket");
if ( bind(fd,(struct sockaddr*)&addr,sizeof(addr)) < 0)
erro("na funcao bind");
if( listen(fd, 5) < 0)
erro("na funcao listen");

while (1) {
client_addr_size = sizeof(client_addr);
client = accept(fd,(struct sockaddr *)&client_addr,&client_addr_size);
d++;
if (client > 0) {
if (fork() == 0) {
close(fd);

process_client(client);
exit(0);
}
close(client);
}
}
return 0;
}
void process_client(int client_fd)
{
int nread = 0;
FILE *f;
      int  i,x=0;
      int ultimo;

      char nomes[100][30];
char buffer[bUF_SIZE];
/*ver se e ip privado or not*/


do {
nread = read(client_fd, buffer, BUF_SIZE-1);
/*passa o ip de string para inteiro em quatro partes(ip1,ip2,ip3,ip4)*/
buffer[nread] = '\0';
char token[10][10];
int count=0,y=0,w=0;
int someleft=strlen(buffer);
int ip1,ip2,ip3,ip4;

while(count<someleft)
{
   if(buffer[count]!='.')
   {
      token[y][w]=buffer[count];
      w++;
   }
   else
   {
      w=0;
      y++;
   }
   count++;
}
   ip1=atoi(token[0]);
ip2=atoi(token[1]);
ip3=atoi(token[2]);
ip4=atoi(token[3]);
printf("%d\n",d);
if (ip1 == 10 && ip2 <255 && ip2>0 && ip3 < 255 && ip3>0 && ip4 <255 && ip4>0)
{
f = fopen("poolconf.txt", "r");
      if( f == NULL )
        return 0;

      i = 0;
     	
      while( fgets(nomes[i], 30, f) != NULL )
        {
          ultimo = strlen( nomes[i] );
          nomes[i][ultimo-1] = '\0';       /* para mandar fora o '\n' */
          i++;
        
}


fclose( f );
write(client_fd,nomes[d % 2],20);
write(client_fd," 0\n",4);
fflush(stdout);
}
else{
d=d-1;
}
} while (nread > 0);
close(client_fd);
}
void erro(char *msg)
{
printf("Erro: %s\n", msg);
exit(-1);
}

Eu fiz esse código e o que pretendo é lendo um ficheiro com duas linhas( ISTO É SÓ UM TESTE) fazendo telnet com um cliente dando como string o seu proprio ip (tendo neste caso que ser privado) ele devolve do ficheiro poolconf o ip ora da primeira linha ora da segunda e por ai fora consoante o numero de clientes(telnets) ligados.

O meu problema é quando o ip do telnet é incorrecto ele nao deveria devolver nada e decrementar o meu contador ------>d<------ Mas não consigo fazer isso ele nao me decrementa esse contador :S.

Alguém tem ideia como fazer? Já estou a semanas nesse problema :@

Desculpem o incómodo.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bubulindo

Tendo em conta que decrementas o contador se isto

if (ip1 == 10 && ip2 <255 && ip2>0 && ip3 < 255 && ip3>0 && ip4 <255 && ip4>0)

for falso eu diria que é aí que está o teu problema. Já experimentaste separar as condições por parêntesis?


include <ai se te avio>

Mãe () {

}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Flames

Tendo em conta que decrementas o contador se isto

if (ip1 == 10 && ip2 <255 && ip2>0 && ip3 < 255 && ip3>0 && ip4 <255 && ip4>0)

for falso eu diria que é aí que está o teu problema. Já experimentaste separar as condições por parêntesis?

Opa se queres que te diga ja experimentei de tudo e mesmo assim o programa é que "manda" em mim ...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Flames

O que entendes por "ip de telnet errado"? É um IP com um formato incorrecto, ou IP público?

Cumps!

É assim se a string enviada pela telnet não for um ip privado(neste caso é um ip publico) o contador deveria decrementar senao o contador continuaria a incrementar sem problema...

Cumps!!!!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
NuGuN

Antes de mais tens de ter em atenção que IP's privados não são só os que começam por '10'.

Penso que o problema está  aqui:

           else
           {
              w=0;
              y++;
           }

Ten ta substituir por:

           else
           {
              token[y][w] = '\0';
              w=0;
              y++;
           }

Pelo menos aí estava um problema... Quando colocavas por exeplo 192.168.1.1 (números de três digitos nos primeiros dois octetos) e em seguida enviavas um IP apenas com dois digitos por octeto, por exemplo 12.13.14.15, ele ia assumir algo deste genero:

122.138.14.15

Isto porque não estavas a "limpar" correctamente o a variável. E embora estejas sempre a redeclarar a variável token a cada ciclo (o que também não é correcto), não quer dizer que ao fazeres isso a variável fique "limpa", porque se reparares, neste teu código dificilmente ela vai mudar de endereço de memória. E podes comprovar isso colocando este printf depois de declarares a variável:

printf( "address: %p", &token );

Cumps!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Flames

Antes de mais tens de ter em atenção que IP's privados não são só os que começam por '10'.

Penso que o problema está  aqui:

           else
           {
              w=0;
              y++;
           }

Ten ta substituir por:

           else
           {
              token[y][w] = '\0';
              w=0;
              y++;
           }

Pelo menos aí estava um problema... Quando colocavas por exeplo 192.168.1.1 (números de três digitos nos primeiros dois octetos) e em seguida enviavas um IP apenas com dois digitos por octeto, por exemplo 12.13.14.15, ele ia assumir algo deste genero:

122.138.14.15

Isto porque não estavas a "limpar" correctamente o a variável. E embora estejas sempre a redeclarar a variável token a cada ciclo (o que também não é correcto), não quer dizer que ao fazeres isso a variável fique "limpa", porque se reparares, neste teu código dificilmente ela vai mudar de endereço de memória. E podes comprovar isso colocando este printf depois de declarares a variável:

printf( "address: %p", &token );

Cumps!

A gama de ip's privados está incompleta no if eu sei isto é apenas um teste... Só que não consigo de maneira nenhuma decrementar o D quando chega ao else...

Por exemplo: no primeiro telnet o d fica = 0 ... mas se eu meter um ip publico ele deveria decrementar esse 0 e voltar a menos um para que na proxima volta desse o primeiro ip PUBLICO da lista em vez disso dá-me sempre o segundo ip da lista ( O maldito d não quer ser decrementado) ARRRRRRRRRRRRR

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Tu decrementas o 'd' "dentro do fork". "Dentro do fork" esse e outro d, o d original nao e acessivel "dentro do fork".

Sugestao: melhora a identacao do teu codigo.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Flames

Tu decrementas o 'd' "dentro do fork". "Dentro do fork" esse e outro d, o d original nao e acessivel "dentro do fork".

Sugestao: melhora a identacao do teu codigo.

Eu sei a indetacao está pessima :S isso já é linhas e linhas de desespero... Tens alguma ideia que me dês para conseguir tal proeza? :S

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.