working with big packets and sockets.

I

ifmusic

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,char IProuterA[16], int *ProuterA );
static int escuchar_socket (int listen_port);
int crearsocketyconectarse(int p,char* ip);
time_t* ponertiempoactual(time_t *t);
unsigned char* Ip2Short(char* s);

/*listas de Ciudad...*/

Ciudad* buscarCiudad(Ciudad** 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,rcvToken;
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=malloc(sizeof(Ciudad*));
ListaTDP=malloc(sizeof(TDP*));
unToken.listaCiudad=ListaCiudades;
unToken.listaTDP=ListaTDP;
/*Lleno:
1) La identificacion, cualquiera...
*/ unToken.Ident=1;
/*Agrego 2 ciudades*/
unToken.listaCiudad= agregarCiudad (unToken.listaCiudad,"BuenosAires",
"192.168.0.1",
9 , 1);
unToken.listaCiudad= agregarCiudad (unToken.listaCiudad,"Tegucigalpa",
"192.168.0.2",
10 , 2);
unToken.listaCiudad= agregarCiudad
(unToken.listaCiudad,"RiodeJaneiro", "192.168.0.3", 11 , 3);
unToken.listaCiudad= agregarCiudad (unToken.listaCiudad,"Timbuctu",
"192.168.0.4", 12 , 4);
/*Agrego 3 equipos*/
unToken.listaTDP = agregarTDP (unToken.listaTDP,"BuenosAires", "eqA",
3, 1, 0,0);
unToken.listaTDP = agregarTDP (unToken.listaTDP,"Tegucigalpa", "eqB",
0, 0, 1,0);
unToken.listaTDP = agregarTDP (unToken.listaTDP,"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.listaTDP);
printf("///////Lista Ciudad///////\n");
imprimirCiudad(unToken.listaCiudad);
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=sizeof(int); //El token pesa lo que un Int, MAS....

for (i=0;unToken.listaCiudad!=NULL; i++) // i Veces *
tokenSize += sizeof(Ciudad) ; //Registro de Ciudad
printf("UN Registro Ciudad pesa,:%d \n",sizeof(Ciudad));
tokenSize++;
for (i=0;unToken.listaTDP!=NULL; i++) // i Veces *
tokenSize += sizeof(TDP) ; //Registro de TDP
printf("Registro 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/RegistrosdeCiudad-IdemDeTDP \ Termina con "\" */
memcpy(paquete, &unToken.Ident, sizeof(int));
//paquete[sizeof(int)]='/'; //Separo
offset=sizeof(int); //lo corro 1 Int. (4 bytes!)
//printf("Offset:%d\n",offset);
for (i=0;unToken.listaCiudad!=NULL; i++)
{//Copio un registro, aumento el offset a Registro +1 y Termino en
Offset +1 con '/'
memcpy(paquete + offset, unToken.listaCiudad, 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.listaTDP!=NULL; i++)
{//Copio un registro, aumento el offset a Registro +1 y Termino en
Offset +1 con '/'
memcpy(paquete + offset, unToken.listaTDP, sizeof(TDP));
offset+= sizeof(TDP) ; //paquete[offset-1] ='/' ;
}

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

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

/*s= crearsocketyconectarse(5000,"127.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(pfds[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+(total*i), rcvdata, 256);
i++;
}
printf("nbytes:%d, total:%d\n",nbytes,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(&rcvToken.Ident, buf, sizeof(int)); offset+=sizeof(int);
printf("///////////////////////////\n");
for (i=offset; buf!='-'; i++); //Busco el divisor de listas
printf("i:%d\n", i);
separador=i;
i=(i-4) / sizeof (Ciudad);// printf("Cantidad de Registros Ciudad en
el Buffer: %d\n", i);
//Dimensiono
rcvCiudades=malloc(sizeof(Ciudad*) * (i+1));
//Copio de Bufer a la Lista <DANGER!>
rcvCiudades=NULL;
for (j=0; j<i; j++){
auxCiudad= malloc(sizeof(Ciudad));
memcpy(auxCiudad , (buf+sizeof(int)) + (sizeof(Ciudad)*j),
sizeof(Ciudad));
rcvCiudades[j]=auxCiudad;
}
imprimirCiudad(rcvCiudades);
printf("///////////////////////////\n");
for (i=offset; buf!='\\'; i++); //Busco el fin del paquete
printf("///////////////////////////3\n");
//printf("Fin de paquete:%d,\n", i);
i=(i-separador-1)/sizeof(TDP);
printf("malloqueo:%d, sizeof(TDP*):%d, i:%d\n",sizeof(TDP*) *
(i+1),sizeof(TDP*),i);
printf("///////////////////////////4\n");
rcvTDPs=malloc(sizeof(TDP*) * (i+1));
rcvTDPs=NULL;

for (j=0; j<i; j++){
auxTDP= malloc(sizeof(TDP));
memcpy(auxTDP, (buf+separador+1) + (sizeof(TDP)*j), sizeof(TDP));
rcvTDPs[j]=auxTDP;
}
//imprimirTDP(rcvTDPs);
printf("///////////////////////////5\n");
rcvToken.listaCiudad=rcvCiudades;
rcvToken.listaTDP=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.listaTDP);
printf("///////Lista Ciudad///////\n");
imprimirCiudad(rcvToken.listaCiudad);
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 != NULL) i++;
aux=(Router*) malloc (sizeof (Router));
memcpy(aux->ip,ip,4);
aux->socket=socket;
aux->puerto=puerto;
lista=(Router**) realloc(lista,sizeof(Router*) * (i+1+1));
lista=aux;
lista[i+1]=NULL;
return lista;
}

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

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

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

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

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

//---------------------------------------
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= (unsigned char) atoi(tok);
}
i++;
}
return ret;
}

char* IP2Dotted(unsigned 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);
//printf("ret: %s\n",aux);
pos+=strlen(aux);
strcat(ret,aux); strcat (ret, ".");
}
for (i=0; i<16 && puntos<4;i++)
if (ret=='.') 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 != NULL) i++;
aux=(Ciudad*) malloc (sizeof (Ciudad));
aux->puerto=puerto;
//aux->socket=socket;
aux->orden=orden;
strcpy(aux->ip, ip);
strcpy(aux->ciudad,ciudad);
lista=(Ciudad**) realloc(lista,sizeof(Ciudad*) * (i+1+1));
lista=aux;
lista[i+1]=NULL;
return lista;
}

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

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

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

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 != NULL) i++;
aux=(TDP*) malloc (sizeof (TDP));
aux->puntos=puntos;
aux->pGanados=pGanados;
aux->pPerdidos=pPerdidos;
aux->pEmpatados=pEmpatados;
strcpy(aux->equipo, equipo);
strcpy(aux->ciudad,ciudad);
lista=(TDP**) realloc(lista,sizeof(TDP*) * (i+1+1));
lista=aux;
lista[i+1]=NULL;
return lista;
}
TDP** quitarTDP (TDP** lista, char ciudad[20]){
int i;
i=0;

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

void imprimirTDP(TDP** lista){
int i;
for (i=0;lista!=NULL; i++)
printf("Equipo %s, de:%s,\nPuntos %d, PG:%d PE:%d PP:%d\n",
lista->equipo,lista->ciudad,lista->puntos,
lista->pGanados,lista->pEmpatados,lista->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!=NULL);i++)
if (!strcmp(ciudad,lista->ciudad)) break;
if (criterio == 2)
for (i=0; (lista!=NULL);i++)
if (!strcmp(equipo,lista->equipo)) break;
if (criterio == 3)
for (i=0; (lista!=NULL);i++)
if (puntos==lista->puntos) break;
if (criterio == 4)
for (i=0; (lista!=NULL);i++)
if (pGanados==lista->pGanados) break;
if (criterio == 5)
for (i=0; (lista!=NULL);i++)
if (pEmpatados==lista->pEmpatados) break;
if (criterio == 6)
for (i=0; (lista!=NULL);i++)
if (pPerdidos==lista->pPerdidos) break;

return lista;
}
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 crearsocketyconectarse(int p,char* ip)
{
int create_socket,nbytes;
char buf[50];
struct sockaddr_in address;

if ((create_socket = socket(AF_INET,SOCK_STREAM,0)) > 0)
{
address.sin_family = AF_INET;
address.sin_port = htons(p);
inet_pton(AF_INET,ip,&address.sin_addr);

if (connect(create_socket,(struct sockaddr *)&address,sizeof(address))
== 0)
{
//nbytes=recv(create_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!
 
W

Walter Roberson

I have This Code.
if (socketpair(AF_UNIX, SOCK_STREAM,0,s) == -1 ) exit(1);

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.programming .

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,770
Messages
2,569,584
Members
45,075
Latest member
MakersCBDBloodSupport

Latest Threads

Top