Lunes 23 de Diciembre de 2024, 19:46
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Asuntos Oficiales
»
Papelera
(Moderador:
F_Tanori
) »
Problemas Con Paquetes De Datos
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Problemas Con Paquetes De Datos (Leído 1805 veces)
Pabs2000
Nuevo Miembro
Mensajes: 1
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));
}
}
Tweet
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Asuntos Oficiales
»
Papelera
(Moderador:
F_Tanori
) »
Problemas Con Paquetes De Datos