Dudas/problemas Winsock

Survivor

He estado probando winsock para poder realizar una comunicacion cliente-servidor tanto por udp como por tcp , mi problema / pregunta es que puedo mandar mensajes de texto perfectamente no hay ningun problema pero estoy ante una situacion en la que necesito mandar un buffer de una webcam y por mas que busco no veo la posibilidad de mandar otra cosa por winsock que no sea cadena de texto , mi pregunta vendria a ser :

¿ alguien conoce la forma de poder pasar ese buffer de int mediante winsock o otra libreria ?

por mas que miro el ejemplo que usan todo el mundo es el del cliente echo o alguna variacion de este pero no he encontrado ningun sitio que me diga claramente que lo unico que puedo mandar por winsock es cadenas de texto

De ser mediante cadena de texto , ¿alguien tiene alguna idea de como convertir ese buffer a cadena de caracteres y despues recuperarlo?

Me vendria genial cualquier tipo de ayuda ya sea directa o indirectamente mediante enlace a cualquier tutorial que se me haya escapado

Gracias por contestar ;)

LOc0

send() envía bytes así que tienes que "castear" tu búffer a unsigned char. Por ejemplo, supongamos que el búffer de la webcam es algo así:

int buffer_salida[1024], buffer_llegada[1024];

Para enviar/recibir:

send(socket, (unsigned char)buffer_salida, 1024sizeof (int), 0);

recv(socket, (unsigned char)buffer_llegada, 1024sizeof(int), 0);

Ojo al sizeof. Si el tipo del búffer es una estructura (en vez de int) es posible que sizeof() devuelva un valor "incorrecto". En ese caso tendrás que ingeniar algo para saber el tamaño exacto en BYTES del búffer.

Algún ejemplo (no de esto exactamente) pero que a lo mejor te orienta -> http://www.hackvalue.org/fuentes/coloreator.php?fichero=chateitor/sockets.c

Salu2 ;)

Survivor

Pues voy a probarlo , estaba pensando en una solucion muy rebuscada y si esto funciona me va a ser de muchisima ayuda

Gracias ;)

10 días después
Sr_RoS

#3 no te olvides de comentarlo aqui

Survivor

#4 Lo he arreglado no ha sido como me dijisteis pero funciona

Cliente

WSAStartup(MAKEWORD(2,2),&wsa);
char ip[] = "127.0.0.1";
                         
sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if (sock==-1) { printf("Error al crear el socket"); return -1; } direc.sin_family=AF_INET; direc.sin_port=htons(9999);
direc.sin_addr.s_addr = inet_addr(ip); memset(direc.sin_zero,0,8); //Intentamos establecer la conexiÛn conex=connect(sock,(sockaddr *)&direc, sizeof(sockaddr)); //tamaño del buffer en mi caso es el array de unsigned char que tengo para mandar donde esta //representados los canales RGB de forma lineal . Ejemplo : //Canal Rojo >> Buffer[0]=120 //Canal Verde >> Buffer[1]=50 //Canal Azul >> Buffer[2]=30 // y asi sucesivamente hasta acabar con la imagen char Buffer[TAMANYO]; unsigned char *data=(unsigned char*)malloc(TAMANYO*sizeof(unsigned char));
//copiamos el contenido de data que es unsigned char a Buffer que es char memcpy(Buffer,data,sizeof(data)); //una vez establecida la conexion mandamos el buffer en principio TCP permite según las especificaciones mandar ficheros hasta de 6 GB sin partir , aunque claro eso en la especificación luego esta la realidad send(sock,Buffer,sizeof(Buffer),0);

Servidor

char Buffer[TAMANYO];

   //Inicializamos
   WSAStartup(MAKEWORD(2,0),&wsa);
   
//Creamos el socket sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //defnimos direcciÛn por defecto, ipv4 y el puerto 9999 local.sin_family = AF_INET; local.sin_addr.s_addr = INADDR_ANY; local.sin_port = htons(9999); //asociamos el socket al puerto if (bind(sock, (SOCKADDR*) &local, sizeof(local))==-1) { printf("error en el bind\n"); return -1; } //ponemos el socket a la escucha if (listen(sock,1)==-1) { printf("error en el listen\n"); return -1; } len=sizeof(struct sockaddr); sock=accept(sock,(sockaddr*)&local,&len); len=recv(sock,Buffer,sizeof(Buffer),0); unsigned char *bufferRec=(unsigned char*)malloc(TAMANYO*sizeof(unsigned char));
if (len>0) { bufferRec=Buffer; }

No se si os servirá de ayuda pero aqui os lo dejo

LOc0
unsigned char *bufferRec=(unsigned char*)malloc(TAMANYO*sizeof(unsigned char));
if (len>0) { 
bufferRec=Buffer;
}

Ojo que ahí tienes un posible MEMORY LEAK http://en.wikipedia.org/wiki/Memory_leak ya que reservas primero un trozo de memoria con malloc y luego te cargas el puntero a esa zona haciendo bufferRec=Buffer

Salu2 ;)

Survivor

tienes razón lo he intentado simplificar desde mi código y me he hecho un lio al fnal pongo aqui una solución para poder enviar paquetes con estructuras y reinterpretarlos:

typedef struct{
       unsigned char magic;
       unsigned int w,h;
       unsigned long timestamp;
       int op;
       int compresion;
       char imagenOrignalSinComprimir;
       unsigned int tamanyo1,tamanyo2;
       unsigned char data[30000000];
       }Mensaje;
       
int calculoTamanyo(Mensaje *a){ return 1+4*2+sizeof(long)+4+4+1+4*2+a->tamanyo1+a->tamanyo2;
} int main(int argc, char *argv[]) { Mensaje *a=(Mensaje *)new unsigned char[sizeof(Mensaje)]; a->magic=0xF1;
printf("magic %x\n",a->magic); send(sock,a,calculoTamanyo(a),0); unsigned char *imagen1=a->data; unsigned char *imagen2=&(a->data[a->tamanyo1]) unsigned char *imagen2=(unsigned char *)(a->data+a->tamanyo1); return 0; }

no he puesto un código que se pueda compilar porque faltan librerias , inicializar sockets etc pero para que quien quiera aprender tenga una referencia que es lo que yo no habia podido encontrar

Usuarios habituales

  • Survivor
  • LOc0
  • Sr_RoS