• Jueves 14 de Noviembre de 2024, 17:13

Autor Tema:  Problemas Con Paquetes De Datos  (Leído 1793 veces)

Pabs2000

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Problemas Con Paquetes De Datos
« en: Martes 2 de Octubre de 2007, 23:48 »
0
Tengo un programa en C, que tiene que ser usado como cliente para enviar paquentes a un "servidor" el cual entra por un socket, les envío un codigo que tengo que "reutilizar"!!!!!, espero que me ayuden y me digan que cambiar para poder reutilizarlo.

Necesito ayuda por favor!!!!!!!!!!!!

Código de Cliente:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>

void error(char *msg)
{
    perror(msg);
    exit(0);
}
int makemess(int id,int nsgt,int v,char *config)
{
   int i,l,a;
   //char config[2048];

   
   //j=hex(num_hexa[k])*16+hex(num_hexa[k+1]);
config[8]=(char)66;//r)129;//tpgt0x81
i=nsgt/256;
l=nsgt-256*i;

config[9]=(char)i;//sgt
config[10]=(char)l;//nsgt
a=4;
i=a/256;
l=a-256*i;
config[11]=(char)i;//lengt
config[12]=(char)l;//lengt
config[0]=0x7E;// tipo mensaje
config[1]=0x40;// tipo mensaje
i=id/256;
l=id-256*i;
config[2]=(char)i;//primera parte de identificador
config[3]=(char)l;// segunda parte de indentificador
i=nsgt/256;
l=nsgt-256*i;
config[4]=(char)i;//NSEC.
config[5]=(char)l;//NSEC
a=5+a;
i=a/256;
l=a-256*i;
config[6]=(char)i;//lengt

config[7]=(char)l;//lengt



config[13]=(char)v;//lengt

config[14]=(char)nsgt;//lengt
i=nsgt/256;
l=nsgt-256*i;

config[15]=(char)i;//sgt
config[16]=(char)l;//nsgt

return (a);
   }
void client(int n,unsigned char *buffer,int portno, char *direcc,int nsgt,int v)
{ int sockfd, n1,i,l,ii,a;
    struct sockaddr_in serv_addr;
    struct hostent *server;
char config[600];
    //char buffer[256];
   /* if (argc < 3) {
       fprintf(stderr,"usage %s hostname port\n", argv[0]);
       exit(0);
    }*/
   // portno = atoi(argv[2]);
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
        error("ERROR opening socket");
    server = gethostbyname(direcc);
    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr,
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);
    serv_addr.sin_port = htons(portno);
    if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
        error("ERROR connecting");
   
      printf("Please enter the message: ");
    bzero(buffer,256);
//while(1)
{
    bzero(buffer,256);
       n=read(sockfd,buffer,256);
    if (n < 0)
         error("ERROR reading from socket");
         printf("\n");
        // a=a;

      i=buffer[5];//=(char)i;//lengt

      a=buffer[6]+i*256;//=(char)l;//lengt
          printf("-a-%i ",a);
         for ( i=0;i<13;i++)
         {
    printf("\n %i=%x =%i",i,buffer,buffer);}
     printf("\n ---");
     //for ( i=13;i<a-13;i++)
     a=4;
     a=a+7;
     printf("\n -%i--",a);
    // for ( i=13;i<=a;i++)
    //     {
    //printf("\n%i=%c =%i",i,buffer,buffer);
   // }
    printf("\n %i",buffer[3]);
//       fgets(buffer,255,stdin);
a=makemess(buffer[3],nsgt,v,config);
//printf("-a-%i ",a);
         for ( i=0;i<17;i++)
         {
    printf("\n %i=%x =%i",i,config,config);}
     printf("\n ---");
   n = write(sockfd,config,17);
   
   if (n < 0)
        error("ERROR writing to socket");
    //return 0;
  }
}
int main(int argc, char *argv[])
{
    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    char buffer[256];
    if (argc < 5) {
       fprintf(stderr,"usage %s hostname port\n", argv[0]);
       exit(0);
    }
    portno = atoi(argv[2]);

    //server = gethostbyname(argv[1]);
  //while(1)
  {client(0,argv[1],portno,argv[1],atoi(argv[3]),atoi(argv[4]));
  }
   return 0;
}

#######################################################
Código de Socket

/*   

deqclient-s
socket de entrada
lee archivo server-data con loas datos necesarios

error
8:
7:
6:
5:
4:
3:

*/

#include "qutil.h"
#define serverdata "server-data"//nombre de archivos con parametros de configuracion

#define COM(X) X

#define true 1
#define FALSE !true



TPINIT *tpinitbuf;
void *call_tux2pinar( void *ptr );
int c=0;
//void iniciaTimer();
//int desencola(char *);
int encripta(char *,char *,int);
int desencripta(char *,char *,int);

int dostuff (int,int,char *,char *);

char * fmtqerr(int);

static unsigned int MAXLINE=255;
static unsigned int TIME_OUT=30;
static unsigned int MYPORT=15040;//15022//15025//25534 //the port users will be connecting to 3490//
static unsigned int BACKLOG=10;    // how many pending connections queue will hold
static unsigned int MAXLENGTH=256; //largo maximo del mensaje
static unsigned int MAXTRAMA=256; //largo maximo de la trama
static unsigned int MAXBUFFER=10000; //largo maximo de la trama
static unsigned int RCVLEN=1000;
static char *SERVICE="TUX2PINAR";
static char servicio[256][5];
void obtain_server_data()
{unsigned int largo;
int f1, f2, n,i;
char buf[BUFSIZ];
//char *apu;
char xml[10][20];
char dato[10][20];
char *apu[10];
int a=9;
char ddd[10];
char *apu2;
strcpy( xml[1],"RCVLEN");
strcpy( xml[2],"SERVICE");
strcpy( xml[3],"MAXLINE");
strcpy( xml[4],"TIME_OUT");
strcpy( xml[5],"BACKLOG");
strcpy( xml[6],"server-port");
strcpy( xml[7],"MAXLENGTH");
strcpy( xml[8],"MAXBUFFER");
strcpy( xml[9],"MAXTRAMA");



if((f1=open(serverdata, O_RDONLY))==-1)
{
   perror("Error opening file messerror.log");
}


/* usando stats se pueden mantener los permisos */

while((n=read(f1, buf, BUFSIZ))>0)
{
   for(i=1;i<=a;i++){
      apu=strstr( buf, xml );
      apu=strstr( apu, ">" )+1;
      largo=strstr( apu, "</" )-apu;
      strncpy(dato,apu,largo);
      }
   
   for(i=0;i<256;i++)
   {
   sprintf(ddd,"-%i-\0",i);
   apu2=strstr( buf,ddd );
   if(apu2!=NULL)
      {
      apu2=strstr( apu2, ">" )+1;
      largo=strstr( apu2, "</" )-apu2;
      strncpy(servicio,apu2,largo);
      }
   }
   
}

RCVLEN =atoi(dato[1]);
SERVICE =dato[2];
MAXLINE = atoi(dato[3]);
TIME_OUT =atoi(dato[4]);
BACKLOG = atoi(dato[5]);;
MYPORT=atoi(dato[6]);
MAXLENGTH =atoi(dato[7]);
MAXBUFFER = atoi(dato[8]);
MAXTRAMA=atoi(dato[9]);
/// if(write(f2, buf, n)!=n)
//      error("Write error on file %s", argv[2]);
//printf("%i %i",RCVLEN,SERVICE);

}
int callpros(char *servicio,char *data,char *idcola,int largo)
{int local_tperrno=0;
      char *sendbuf, *rcvbuf;
   long sendlen, rcvlen;
   int resp,ret,i;

   sendlen = strlen("");

   /* Allocate STRING buffers for the request and the reply */

   if((sendbuf = (char *) tpalloc("CARRAY", NULL, 32+largo+1)) == NULL) {
      (void) fprintf(stderr,"Error allocating send buffer\n");
      //tpterm();
      return(-1);
   }
//printf("\nab0");
   if((rcvbuf = (char *) tpalloc("CARRAY", NULL, 1024)) == NULL) {
      (void) fprintf(stderr,"Error allocating receive buffer\n");
      tpfree(sendbuf);
      //tpterm();
         return(-2);
   }
//printf("\nab");
   (void) memcpy(sendbuf, idcola,32);
   (void) memcpy(sendbuf+32, data,32+largo);
   printf("\n enviaid \n");
   for(i=0;i<32;i++)   printf("-%x",sendbuf);
printf("\nenvia2\n");
   for(i=32;i<52;i++)printf("-%x-",sendbuf);
printf("\nenvia2\n");
   for(i=52;i<32+largo;i++)   printf("%c",sendbuf);
printf("\n\n");
   /* Request the service TOUPPER, waiting for a reply */
         
     ret = tpcall(servicio, (char *)sendbuf, largo+32, (char **)&rcvbuf, &rcvlen, (long)0);
     local_tperrno=tperrno;

    if(ret == -1) {
        fprintf(stdout, "\n Returned string is: %s\n", rcvbuf);
        fprintf(stderr,"errno:%d desc:%s\n",local_tperrno,tpstrerror(local_tperrno));
        tpfree(sendbuf);
        tpfree(rcvbuf);
       // tpterm();
        return(-3);
    }
printf("\nrespuesta\n");
   for(i=0;i<rcvlen;i++)
   printf("%c",rcvbuf);
printf("\nfin\n");
   //printf("\na0 %s",rcvbuf);
   //(void) fprintf(stdout, "Returned len: %d\n", rcvlen);
   //(void) fprintf(stdout, "Returned string is: %s\n", rcvbuf);
resp=atoi (rcvbuf);
   /* Free Buffers & Detach from System/T */
   tpfree(sendbuf);
   tpfree(rcvbuf);
//   tpterm();
   return(resp);
}


char *actual_date()
{
   time_t comienzo;
   struct tm *tiempoComienzoPtr;
   
   comienzo = time( NULL );
   
   
   tiempoComienzoPtr = localtime( &comienzo );
   return asctime(tiempoComienzoPtr);
}
int encripta(char *config1,char *config,int a)
{/**********************
*comienza encriptacion*
***********************/
   {   int i;
      char *puntero;
      char b[2];
      b[0]=0X7F;
      b[1]=0X00;
      config1[0]=0x7E;//encriptado
      i=1;

     memcpy(config1+1,config,a+7);  
      while((puntero = (char *)memchr( config1+1, 0x7E, a ))!=NULL)
         {a=a+1;
         i=puntero-config1;
         memcpy(puntero,b,2);
         memcpy(config1+i+2,config+i,a-i);
      }
      a=a+1;
   }
   return(a);
   /**********fin encriptacion*/
}
int desencripta(char *config1,char *config,int a)
{/**********************
*comienza encriptacion*
***********************/
{   int i;
   char *puntero;
   char b=0x7E;
   //config1[0]=0x7E;//encriptado
i=1;

  memcpy(config1,config+1,a+6);  
while((puntero = (char *)memchr( config1, 0x7F, a ))!=NULL)
{a=a-1;
      i=puntero-config1;
   *puntero=b;
   memcpy(config1+i+1,config+i,a-i);
}
a=a-1;
}
return(a);
   /**********fin encriptacion*/
}
/******** DOSTUFF() *********************
There is a separate instance of this function
for each connection.  It handles all communication
once a connnection has been established.
*****************************************/
int dostuff (int sock,int n,char *data1,char *msgid)
{   //   char msgid[32];
   char corrid[32];
   char str2[MAXLENGTH*10],buffer[MAXLENGTH]; //buffer para ir leyendo a través del socket
   char *str1; //puntero al mensaje completo siempre comienza con @
   //char data1[2024];
   unsigned char data[2024];
   int i,x,j; //variable auxiliar
   //inicializo las variables usadas para el manejo del buffer      
   bzero(buffer,MAXLENGTH);
   bzero(data,2024);

    {
       
    //   if(n>0)
          {
              n=desencola("QBININ","CARRAY", data1,0,FALSE,NULL,msgid,corrid);
              if(n>=1)
                 {n=encripta(data,data1,n);
            printf("\n-------------se manda------------%i",n);
            for (j=0;j<n;j++)    printf(" -%i[%x]",j,data[j]);
            printf("\n-----------------------------");
            
         i = write(sock,data,n);}
            printf("\n mensaje enviado esperando respuesta%i\n",i);

          if (i < 0)
               {//error("ERROR writing to socket");
                  return(-1);}
   
            //recibo mensajes a traves del socket
            x=0;
            memset(str2, 0, MAXLENGTH*10);
            
            while(0 != (i=read(sock,buffer,MAXLENGTH-1)) && i>=MAXLENGTH-1 )// && mr<=1000)
               {
               
               if(i>0)
               {
                  memcpy(str2, buffer,i);
                  x=x+i;
                  bzero(buffer,MAXLENGTH);
                  
               }
   
               }
               
                  if(i>0)
               {
                  memcpy(str2, buffer,i);
                  x=x+i;
                  bzero(buffer,MAXLENGTH);
                  
               }
               printf("listo recuperacion1");
               if(i<1 && x<1)
                  {
                     return(-1);
               }
         
            n=desencripta(data,str2,x);
   
            c=0;
            printf("\n listo recive %i -%s-\n",data[7],servicio[data[7]]);
        printf("\n-------------se 111 manda------------%i",n);
         for (j=0;j<n;j++)    printf(" -%i[%i]",j,data[j]);
            if(servicio[data[7]]!=NULL) callpros(servicio[data[7]],data,msgid,n);
               else
                  {printf("\n protocolo para mensaje %i no definido",data[7]);}
         //   if (data[7]==66)            callpros("sfw",data,idcola,n);
            return(n);
            
         }
         //else
            {//n=desencola(data1);
            }
      }
      return(n);
}
   
main(int argc, char *argv[])
{unsigned int largo;
   int f1, f2, n,i,l,x,j;
   char buf[BUFSIZ];
   unsigned char config[2048];
   char data1[2048];
   char apu[13];
   char mensaje[100];
   int a=0;
   char byte[4];
char msgid[32];
   int sockfd, new_fd, pid;  // listen on sock_fd, new connection on new_fd
   struct sockaddr_in my_addr;   // my address information
   struct sockaddr_in their_addr; // connector's address information
   socklen_t sin_size;
   int yes=1;
   printf("\n aqui\n");
   obtain_server_data();
   if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
      perror("socket");
      exit(1);
      }

   if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
      {
         perror("setsockopt");
         exit(1);
      }

   my_addr.sin_family = AF_INET;       // host byte order
   my_addr.sin_port = htons(MYPORT);    // short, network byte order
   my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
   memset(&(my_addr.sin_zero), '\0', 8); // zero the rest of the struct

   if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
      perror("bind");
      exit(1);
   }

   if (listen(sockfd, BACKLOG) == -1) {
      perror("listen");
      exit(1);
   }

n=0;

   while(1) {  // main accept() loop
   x=0;
         while(x>=0){
      
         //   if(n<1)
               {
         
            //   sleep(1);
            //   n=desencola("QBININ","CARRAY", data1,0,FALSE,NULL,msgid,corrid);
               //if(n==-1)
               //   {//desencolo cualquiera
            //fprintf(stderr,"Error en desencolar\n");
            //exit(-1);   
               //}
            //   else
               {   ///encontro algo en la cola
            //      printf("\nid\n");
            //      for(i=0;i<32;i++)
            //            printf("%x",msgid);
            //      printf("\nid\n");
               }
            }
         //   else
            {
              sin_size = sizeof(struct sockaddr_in);
               //acepto conneccion
      if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) {
         perror("accept");
         exit(1);
         //continue;
      }
   printf("server: got connection from %s at %s\n",inet_ntoa(their_addr.sin_addr),actual_date());
   sprintf(mensaje,"server: got connection from %s at %s\0",inet_ntoa(their_addr.sin_addr),actual_date());


   if(inet_ntoa(their_addr.sin_addr)!=NULL)
   {
   
for (j=0;j<n;j++)    printf("\nencontro j %i= %x",j,data1[j]);
         //printf("\n con  n>0 %s",data1);
      x=dostuff(new_fd,n,data1,msgid);
      if(x>0)
         {
   n=0;}
   else{printf("error");
      
      }
      }
      
}
   }
   shutdown(new_fd,2);   //acts as a partial close.
   printf("client %s : disconnected \n",inet_ntoa(their_addr.sin_addr));
}
   
   




}