working with big packets and sockets.

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • ifmusic@gmail.com

    working with big packets and sockets.

    I have This Code.
    Token.c:

    typedef struct {
    unsigned char orden;
    char ciudad[20];
    unsigned char ip[16]; //que son del router Asociado a la ciudad
    unsigned int puerto; // """
    //int socket;
    }Ciudad;

    typedef struct {
    unsigned char ip[4];
    unsigned int puerto;
    int socket;
    }Router;

    typedef struct{
    char ciudad[20];
    char equipo[20];
    int puntos;
    int pGanados, pPerdidos, pEmpatados;
    } TDP;

    typedef struct {
    int Ident;
    Ciudad** listaCiudad;
    TDP** listaTDP;
    }Token;
    //-------GLOBALES-------------------

    int puertociudad;
    char *ipciudad;
    int puertoescucha;
    int pRouterA;
    char *iplocal;
    int Orden;
    int MASTER;
    int LISTO; //indica si ya tiene una ciudad asociada
    char *ipRouterA;
    Ciudad ciudadAsociada;
    Router **listaRouters;
    //-------FUNCIONES------------------
    void esperar(int t,int s);
    void PI(char *buf,int socket,int nbytes);
    char* LeerConfig(FILE * arch,char* ipciudad,char * iplocal,int
    *puertoescucha,
    int * puertociudad,ch ar IProuterA[16], int *ProuterA );
    static int escuchar_socket (int listen_port);
    int crearsocketycon ectarse(int p,char* ip);
    time_t* ponertiempoactu al(time_t *t);
    unsigned char* Ip2Short(char* s);

    /*listas de Ciudad...*/

    Ciudad* buscarCiudad(Ci udad** lista,
    char ciudad[20], char ip[16],
    int puerto, unsigned char orden, int criterio);

    Ciudad** quitarCiudad (Ciudad** lista, char ciudad[20]);

    Ciudad** agregarCiudad (Ciudad** lista,char ciudad[20], char ip[16],
    int puerto,
    unsigned char orden);

    void imprimirCiudad( Ciudad** lista);

    /*listas de Router...*/
    Router* buscarRouter(
    Router** lista, unsigned char ip[4],int puerto, int socket, int
    criterio);
    void imprimirRouters (Router** lista);
    Router** quitarRouter (Router** lista, int socket);
    Router** agregarRouter (Router** lista, unsigned char ip[4],int puerto,
    int socket);

    /*listas de TDP*/
    TDP* buscarTDP(TDP** lista,
    char ciudad[20], char equipo[20],
    int puntos, int pGanados, int pEmpatados, int pPerdidos,int criterio);

    void imprimirTDP(TDP ** lista);

    TDP** quitarTDP (TDP** lista, char ciudad[20]);

    TDP** agregarTDP (TDP** lista,char ciudad[20], char equipo[20], int
    puntos, int pGanados,
    int pPerdidos, int pEmpatados);

    int sendall(int s, char *buf, int *len);
    int sendall(int s, char *buf, int *len);
    Token unToken,rcvToke n;
    Ciudad **ListaCiudades , **rcvCiudades;
    TDP **ListaTDP, **rcvTDPs;
    Ciudad *auxCiudad;
    TDP *auxTDP;
    int separador;
    //----------------------------------
    int main(int argc,char *argv[])
    {
    /*Lleno un Token Ejemplo ...
    typedef struct { typedef struct{
    int Ident; char ciudad[20];
    Ciudad** listaCiudad; char equipo[20];
    TDP** listaTDP; int puntos;
    }Token; int pGanados, pPerdidos, pEmpatados;
    } TDP;*/

    ListaCiudades=m alloc(sizeof(Ci udad*));
    ListaTDP=malloc (sizeof(TDP*));
    unToken.listaCi udad=ListaCiuda des;
    unToken.listaTD P=ListaTDP;
    /*Lleno:
    1) La identificacion, cualquiera...
    */ unToken.Ident=1 ;
    /*Agrego 2 ciudades*/
    unToken.listaCi udad= agregarCiudad (unToken.listaC iudad,"BuenosAi res",
    "192.168.0. 1",
    9 , 1);
    unToken.listaCi udad= agregarCiudad (unToken.listaC iudad,"Teguciga lpa",
    "192.168.0. 2",
    10 , 2);
    unToken.listaCi udad= agregarCiudad
    (unToken.listaC iudad,"RiodeJan eiro", "192.168.0. 3", 11 , 3);
    unToken.listaCi udad= agregarCiudad (unToken.listaC iudad,"Timbuctu ",
    "192.168.0. 4", 12 , 4);
    /*Agrego 3 equipos*/
    unToken.listaTD P = agregarTDP (unToken.listaT DP,"BuenosAires ", "eqA",
    3, 1, 0,0);
    unToken.listaTD P = agregarTDP (unToken.listaT DP,"Tegucigalpa ", "eqB",
    0, 0, 1,0);
    unToken.listaTD P = agregarTDP (unToken.listaT DP,"BuenosAires ",
    "eqC", 5, 1, 0,2);
    /*Imprimo Resultados*/
    system("clear") ;
    printf("\\");
    printf("///////////////Token, Ident de Juego:%d////////////\n",
    unToken.Ident);
    printf("///////Lista TDP///////////\n");
    imprimirTDP( unToken.listaTD P);
    printf("///////Lista Ciudad///////\n");
    imprimirCiudad( unToken.listaCi udad);
    printf("//////////////////Fin del Token//////////////////\n");

    /*Preparo un Paquetote (con el token bolo)*/
    /*Tomo El Tamaño*/
    { // esta llave esta para poder declarar variables sin que se queje
    el compilador
    int i,j,tokenSize, offset;
    int s[2] = {0};
    int pfds[2], nbytes;
    char *rcvBuf;
    char *buf;
    char *paquete, rcvdata[256];
    int total;
    TDP regAux; //Solo para testear No es Necesario

    tokenSize=sizeo f(int); //El token pesa lo que un Int, MAS....

    for (i=0;unToken.li staCiudad[i]!=NULL; i++) // i Veces *
    tokenSize += sizeof(Ciudad) ; //Registro de Ciudad
    printf("UN Registro Ciudad pesa,:%d \n",sizeof(Ciud ad));
    tokenSize++;
    for (i=0;unToken.li staTDP[i]!=NULL; i++) // i Veces *
    tokenSize += sizeof(TDP) ; //Registro de TDP
    printf("Registr o TDP:%d \n",sizeof(TDP) );

    printf("La data token pesa %d bytes Bolo!, Sin El Terminador\n",
    tokenSize);
    printf("creo un SocketPair, similar a un Socket para probar la
    transferencia\n ");

    if (socketpair(AF_ UNIX, SOCK_STREAM,0,s ) == -1 ) exit(1);
    //send(s[1],"HOLA",strlen( "HOLA"),0);
    //recv(s[0],buf,5,0); printf("buf : %s\n", buf);
    //exit(1);
    /*Malloc y Relleno...*/
    paquete=malloc( tokenSize+1); //+1, por el Terminador
    /*Formato del Token :
    IDENT/RegistrosdeCiud ad-IdemDeTDP \ Termina con "\" */
    memcpy(paquete, &unToken.Ide nt, sizeof(int));
    //paquete[sizeof(int)]='/'; //Separo
    offset=sizeof(i nt); //lo corro 1 Int. (4 bytes!)
    //printf("Offset: %d\n",offset);
    for (i=0;unToken.li staCiudad[i]!=NULL; i++)
    {//Copio un registro, aumento el offset a Registro +1 y Termino en
    Offset +1 con '/'
    memcpy(paquete + offset, unToken.listaCi udad[i], sizeof(Ciudad)) ;
    offset+= sizeof(Ciudad) ; //paquete[offset-1] ='/' ;

    }

    paquete[offset]='-'; //Pongo este separador para separar la lista de
    Ciudades de la TDP
    offset++;
    for (i=0;unToken.li staTDP[i]!=NULL; i++)
    {//Copio un registro, aumento el offset a Registro +1 y Termino en
    Offset +1 con '/'
    memcpy(paquete + offset, unToken.listaTD P[i], sizeof(TDP));
    offset+= sizeof(TDP) ; //paquete[offset-1] ='/' ;
    }

    printf("El paquete esta llenito, offset salio con:%dBytes,por q ahi
    pongo el Terminador Bolo...\n",
    offset);
    paquete[offset]='\\';

    total = tokenSize+1;
    printf("SendAll salio con %d\n",sendall(s[1], paquete,&total ));

    /*s= crearsocketycon ectarse(5000,"1 27.0.0.1");
    write(s,paquete ,tokenSize+1);
    close(s);
    write(pfds[1], paquete, tokenSize+1);*/
    free(paquete);

    /*HASTA AQUI EL ROUTER que ENVIA*/

    /*Ahora Le toca a la Ciudad o Router q Reciben.. */
    //nbytes=read(pfd s[0], buf, tokenSize+1);

    //nbytes=recv(s[1], buf, 256,0);
    //Empiezo a recibir
    total=0;i=0;
    buf=malloc(256) ;
    do {
    nbytes=recv(s[0], rcvdata, 256,0);
    total+=nbytes;
    if (nbytes>0) {
    //Me confio q hay memoria... por ahora...
    buf=realloc(buf , total); memcpy(buf+(tot al*i), rcvdata, 256);
    i++;
    }
    printf("nbytes: %d, total:%d\n",nby tes,total);
    if (nbytes==0) break;
    }while (nbytes==256 );
    free(rcvdata);
    //Procesado del Token/////////////////////////////////////////////
    printf("Tamaño del Paquete Recibido:%d\n", total);
    offset=0;
    //COPIO el IDENT
    memcpy(&rcvToke n.Ident, buf, sizeof(int)); offset+=sizeof( int);
    printf("///////////////////////////\n");
    for (i=offset; buf[i]!='-'; i++); //Busco el divisor de listas
    printf("i:%d\n" , i);
    separador=i;
    i=(i-4) / sizeof (Ciudad);// printf("Cantida d de Registros Ciudad en
    el Buffer: %d\n", i);
    //Dimensiono
    rcvCiudades=mal loc(sizeof(Ciud ad*) * (i+1));
    //Copio de Bufer a la Lista <DANGER!>
    rcvCiudades[i]=NULL;
    for (j=0; j<i; j++){
    auxCiudad= malloc(sizeof(C iudad));
    memcpy(auxCiuda d , (buf+sizeof(int )) + (sizeof(Ciudad) *j),
    sizeof(Ciudad)) ;
    rcvCiudades[j]=auxCiudad;
    }
    imprimirCiudad( rcvCiudades);
    printf("///////////////////////////\n");
    for (i=offset; buf[i]!='\\'; i++); //Busco el fin del paquete
    printf("///////////////////////////3\n");
    //printf("Fin de paquete:%d,\n", i);
    i=(i-separador-1)/sizeof(TDP);
    printf("malloqu eo:%d, sizeof(TDP*):%d , i:%d\n",sizeof( TDP*) *
    (i+1),sizeof(TD P*),i);
    printf("///////////////////////////4\n");
    rcvTDPs=malloc( sizeof(TDP*) * (i+1));
    rcvTDPs[i]=NULL;

    for (j=0; j<i; j++){
    auxTDP= malloc(sizeof(T DP));
    memcpy(auxTDP, (buf+separador+ 1) + (sizeof(TDP)*j) , sizeof(TDP));
    rcvTDPs[j]=auxTDP;
    }
    //imprimirTDP(rcv TDPs);
    printf("///////////////////////////5\n");
    rcvToken.listaC iudad=rcvCiudad es;
    rcvToken.listaT DP=rcvTDPs;
    printf("Ya tengo el Token, (Porq soy un Grosso), toca un tecla para
    verlo...\n");
    getchar();
    system("clear") ;
    printf("\\");
    printf("////////TOKEN RECIBIDO, Ident de Juego:%d////////////\n",
    rcvToken.Ident) ;
    printf("///////Lista TDP///////////\n");
    imprimirTDP( rcvToken.listaT DP);
    printf("///////Lista Ciudad///////\n");
    imprimirCiudad( rcvToken.listaC iudad);
    printf("//////////////////Fin del Token//////////////////\n");



    }

    return 0;
    }

    //------------------------FUNCIONES----------------------------------

    Router** agregarRouter (Router** lista, unsigned char ip[4],int
    puerto,int socket){
    int i;
    Router* aux;
    i=0;
    while (lista[i] != NULL) i++;
    aux=(Router*) malloc (sizeof (Router));
    memcpy(aux->ip,ip,4);
    aux->socket=socke t;
    aux->puerto=puert o;
    lista=(Router** ) realloc(lista,s izeof(Router*) * (i+1+1));
    lista[i]=aux;
    lista[i+1]=NULL;
    return lista;
    }

    Router** quitarRouter (Router** lista, int socket){
    int i;
    i=0;
    for (i=0; (lista[i]!=NULL);i++)
    if (lista[i]->socket==socket ) {
    printf("ENCONTR E esta mierda!!! en la pos %d",i);
    break;
    }
    // || !(strcmp(equipo , lista[i]->equipo)); i++);
    //printf("/////////////////////////////////////i vale:%d\n",i);
    while(lista[i]!= NULL){
    lista[i]=lista[i+1]; i++;
    }

    //printf("///////////////////////////////////////\n");
    return lista;
    }

    void imprimirRouters (Router** lista){
    int i;

    for (i=0;lista[i]!=NULL; i++)
    printf("Router en %d.%d.%d.%d, puerto %d, socket %d\n",
    lista[i]->ip[0],lista[i]->ip[1],lista[i]->ip[2],lista[i]->ip[3],
    lista[i]->puerto, lista[i]->socket);
    }

    Router* buscarRouter(
    Router** lista, unsigned char ip[4],int puerto, int socket, int
    criterio){
    int i;
    if (criterio == 1)
    for (i=0; (lista[i]!=NULL);i++)
    if (!strcmp(ip,lis ta[i]->ip)) break;
    if (criterio == 2)
    for (i=0; (lista[i]!=NULL);i++)
    if (puerto==lista[i]->puerto) break;
    if (criterio == 3)
    for (i=0; (lista[i]!=NULL);i++)
    if (socket==lista[i]->socket) break;
    return lista[i];
    }

    //---------------------------------------
    unsigned char* Ip2Short(char* s)
    { // printf("///////////%s///////\n", s);
    char *tok,*Pip,*ip;
    unsigned char *ret;
    int i=0;
    unsigned char shortip[4];
    tok=(char*) malloc(4); ip = (char*) malloc (16);
    Pip=(char*) malloc (16); ret=malloc(5);
    strcpy(ip,s);
    // printf("///////////%s///////\n", ip);
    tok = strtok(ip,".");
    ret[0]= (unsigned char) atoi(tok);
    i++;
    while (tok && (i<4)){
    tok = strtok(NULL,"." );
    if (i<4){ ret[i]= (unsigned char) atoi(tok);
    }
    i++;
    }
    return ret;
    }

    char* IP2Dotted(unsig ned char* s){
    //for (i;i<4;i++) {
    int i,pos,puntos;
    char* aux ;
    char* ret;

    aux = malloc (3);
    ret=malloc(16);
    pos=0;puntos=0;
    for (i=0;i<5; i++){
    sprintf(aux,"%d ",s[i]);
    //printf("ret: %s\n",aux);
    pos+=strlen(aux );
    strcat(ret,aux) ; strcat (ret, ".");
    }
    for (i=0; i<16 && puntos<4;i++)
    if (ret[i]=='.') puntos ++;
    ret[i-1]='\0';
    return ret;
    }


    Ciudad** agregarCiudad (Ciudad** lista,char ciudad[20], char ip[16],
    int puerto, unsigned char orden)
    {
    int i;
    Ciudad* aux;
    i=0;
    while (lista[i] != NULL) i++;
    aux=(Ciudad*) malloc (sizeof (Ciudad));
    aux->puerto=puert o;
    //aux->socket=socke t;
    aux->orden=orden;
    strcpy(aux->ip, ip);
    strcpy(aux->ciudad,ciudad) ;
    lista=(Ciudad** ) realloc(lista,s izeof(Ciudad*) * (i+1+1));
    lista[i]=aux;
    lista[i+1]=NULL;
    return lista;
    }

    Ciudad** quitarCiudad (Ciudad** lista, char ciudad[20]){
    int i;
    i=0;

    for (i=0; (lista[i]!=NULL);i++)
    if (!strcmp(ciudad ,lista[i]->ciudad)) {
    break;
    }
    while(lista[i]!= NULL){
    lista[i]=lista[i+1]; i++;
    }
    return lista;
    }

    //---------------------------------------------
    void imprimirCiudad( Ciudad** lista){
    int i;
    for (i=0;lista[i]!=NULL; i++)
    printf("#:%d-Ciudad:%s\nIP:% s,Puerto:%d\n",
    lista[i]->orden, lista[i]->ciudad, lista[i]->ip,lista[i]->puerto);
    return;
    }
    //--------------------------------------------
    //------------------------------------------
    Ciudad* buscarCiudad(Ci udad** lista,
    char ciudad[20], char ip[16],
    int puerto, unsigned char orden, int criterio){
    int i;
    if (criterio == 1)
    for (i=0; (lista[i]!=NULL);i++)
    if (!strcmp(ciudad ,lista[i]->ciudad)) break;
    if (criterio == 2)
    for (i=0; (lista[i]!=NULL);i++)
    if (!strcmp(ip,lis ta[i]->ip)) break;
    if (criterio == 3)
    for (i=0; (lista[i]!=NULL);i++)
    if (puerto==lista[i]->puerto) break;
    /*if (criterio == 4)
    for (i=0; (lista[i]!=NULL);i++)
    if (socket==lista[i]->socket) break;
    if (criterio == 4)
    for (i=0; (lista[i]!=NULL);i++)
    if (orden==lista[i]->orden) break;
    */
    return lista[i];
    }

    TDP** agregarTDP (TDP** lista,char ciudad[20], char equipo[20], int
    puntos, int pGanados,
    int pPerdidos, int pEmpatados){
    int i;
    TDP* aux;
    i=0;
    while (lista[i] != NULL) i++;
    aux=(TDP*) malloc (sizeof (TDP));
    aux->puntos=punto s;
    aux->pGanados=pGana dos;
    aux->pPerdidos=pPer didos;
    aux->pEmpatados=pEm patados;
    strcpy(aux->equipo, equipo);
    strcpy(aux->ciudad,ciudad) ;
    lista=(TDP**) realloc(lista,s izeof(TDP*) * (i+1+1));
    lista[i]=aux;
    lista[i+1]=NULL;
    return lista;
    }
    TDP** quitarTDP (TDP** lista, char ciudad[20]){
    int i;
    i=0;

    for (i=0; (lista[i]!=NULL);i++)
    if (!strcmp(ciudad ,lista[i]->ciudad)) {
    break;
    }
    while(lista[i]!= NULL){
    lista[i]=lista[i+1]; i++;
    }
    return lista;
    }

    void imprimirTDP(TDP ** lista){
    int i;
    for (i=0;lista[i]!=NULL; i++)
    printf("Equipo %s, de:%s,\nPuntos %d, PG:%d PE:%d PP:%d\n",
    lista[i]->equipo,lista[i]->ciudad,lista[i]->puntos,
    lista[i]->pGanados,lis ta[i]->pEmpatados,lis ta[i]->pPerdidos);
    return;
    }
    //--------------------------------------------
    //------------------------------------------
    TDP* buscarTDP(TDP** lista,
    char ciudad[20], char equipo[20],
    int puntos, int pGanados, int pEmpatados, int pPerdidos,int criterio){
    int i;
    if (criterio == 1)
    for (i=0; (lista[i]!=NULL);i++)
    if (!strcmp(ciudad ,lista[i]->ciudad)) break;
    if (criterio == 2)
    for (i=0; (lista[i]!=NULL);i++)
    if (!strcmp(equipo ,lista[i]->equipo)) break;
    if (criterio == 3)
    for (i=0; (lista[i]!=NULL);i++)
    if (puntos==lista[i]->puntos) break;
    if (criterio == 4)
    for (i=0; (lista[i]!=NULL);i++)
    if (pGanados==list a[i]->pGanados) break;
    if (criterio == 5)
    for (i=0; (lista[i]!=NULL);i++)
    if (pEmpatados==li sta[i]->pEmpatados) break;
    if (criterio == 6)
    for (i=0; (lista[i]!=NULL);i++)
    if (pPerdidos==lis ta[i]->pPerdidos) break;

    return lista[i];
    }
    static int escuchar_socket (int listen_port) {
    struct sockaddr_in a;
    int s;
    int yes;
    if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
    perror ("socket");
    return -1;
    }
    yes = 1;
    if (setsockopt
    (s, SOL_SOCKET, SO_REUSEADDR,
    (char *) &yes, sizeof (yes)) < 0) {
    perror ("setsockopt ");
    close (s);
    return -1;
    }
    memset (&a, 0, sizeof (a));
    a.sin_port = htons (listen_port);
    a.sin_family = AF_INET;
    if (bind
    (s, (struct sockaddr *) &a, sizeof (a)) < 0) {
    // perror ("bind");
    close (s);
    return -1;
    }
    printf ("Aceptando Conexiones en el puerto:> %d\n", (int)
    listen_port);
    listen (s, 10);
    return s;
    }
    //------------------------------------
    int crearsocketycon ectarse(int p,char* ip)
    {
    int create_socket,n bytes;
    char buf[50];
    struct sockaddr_in address;

    if ((create_socket = socket(AF_INET, SOCK_STREAM,0)) > 0)
    {
    address.sin_fam ily = AF_INET;
    address.sin_por t = htons(p);
    inet_pton(AF_IN ET,ip,&address. sin_addr);

    if (connect(create _socket,(struct sockaddr *)&address,size of(address))
    == 0)
    {
    //nbytes=recv(cre ate_socket,buf, 50,0);
    //buf[nbytes]='\0';
    return create_socket;
    }
    }
    return 0;
    }

    int sendall(int s, char *buf, int *len)
    {
    int total = 0; // how many bytes we've sent
    int bytesleft = *len; // how many we have left to send
    int n;

    while(total < *len) {
    n = send(s, buf+total, bytesleft, 0);
    if (n == -1) { break; }
    total += n;
    bytesleft -= n;
    }

    *len = total; // return number actually sent here

    return n==-1?-1:0; // return -1 on failure, 0 on succes
    }


    ----------------------------------------------------------------------------------------
    I tried to pay attention to mallocs and reallocs and memory matters
    but....
    This code Runs GREAT, it creates some lists, adds data, showes it,
    creates a buffer with all the info in the list, sends it across a
    "me-to-me" socket
    i recieve it, perfectly, read it, put it back to same kind of struct,
    and print out the result.
    The correct Results.

    Now, i took this code to a program which uses this code, i copied some
    of the code into functions.
    The thing is that i create the struct Perfectly buf there must be some
    mistake when i take the struct into a buffer to be sent because after i
    send the buffer through a Real socket connected to another PC -i
    captured the packet with ethereal- and i see the data is Wrong like
    malformed and, of course, becuse of that, the other program ready to
    read and dissamble the packet explodes misarably.

    so, if u can, give it a look, please.

    Thank you in advance!

  • Walter Roberson

    #2
    Re: working with big packets and sockets.

    In article <1146327371.493 466.247160@g10g 2000cwb.googleg roups.com>,
    <ifmusic@gmail. com> wrote:[color=blue]
    >I have This Code.[/color]
    [color=blue]
    > if (socketpair(AF_ UNIX, SOCK_STREAM,0,s ) == -1 ) exit(1);[/color]

    sockets and networking are not part of standard C, so unless you can
    provide portable standard C versions of all of the networking layer,
    we cannot really assist you in this newsgroup.

    I suggest you try comp.unix.progr amming .

    I suggest that you reconfigure your newsreader to use plain text instead
    of "quoted-printable". I had to edit the above line by hand to get rid
    of the =3D=3D that showed up instead of ==

    I also suggest that you post a -link- to your code instead of the code itself.

    --
    Programming is what happens while you're busy making other plans.

    Comment

    Working...