Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Flames

contador em socket

Recommended Posts

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.

Share this post


Link to post
Share on other 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 () {

}

Share this post


Link to post
Share on other 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 ...

Share this post


Link to post
Share on other sites
NuGuN

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

Cumps!

Share this post


Link to post
Share on other 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!!!!

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.