Asignar puerto fuente en Winsock

Iniciado por VladisMSX1, 27 Abril 2012, 10:40 AM

0 Miembros y 1 Visitante están viendo este tema.

VladisMSX1

Buenos días programadores. Soy un desarrollador en prácticas y tengo un pequeño problema. Si pudiérais ayudarme os lo agradecería mucho.

Estoy escribiendo un programa en C para enviar paquetes Artnet a un dispositivo DMX. El programa en si es un socket Winsock que envía una cadena de números por UDP.

El problema que tengo es que cuando creo la conexión y defino el socket, puedo asignar el puerto de destino en el campo sin_port de la estructura sockaddr_in, asignando el valor del puerto a la función htons, pero el puerto de origen que suele aplicarme es un puert efímero con un valor sobre 63000. Y como el cacharrito DMX es un poco pejilguero, si el puerto de origen y el de destino no son ambos 6454, no ejecuta las instrucciones del paquete.

¿Cómo podría decirle a Winsock que me aplique el puerto de origen que yo deseo?

Gracias por todo, un saludo!

Lambda

Prueba usar bind en el socket con la ip como INADDR_ANY y el puerto de origen que tu quieras

VladisMSX1

Ya lo he intentado pero o bien eso no funciona o no lo he codificado bien...

Para dar más información copio el código completo de mi programa. Todo funciona correctamente, salvo la asignación del puerto fuente, que es LO UNICO que me separa de tener el programa terminado:


/*
Compile notes: I used Dev-C++ 4.9.9.2 to compie this. if you get an error like:
        Linker error] undefined reference to `WSAStartup@8'
Add this:
         -lws2_32
to Tools->Compiler Options under the section on compile flags.
*/

//Código y ejemplos obtenidos de: http://foro.hackhispano.com/showthread.php?t=36899

//Lamamos a las librerías:

#include <conio.h>
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <winsock.h>
#define ip "192.168.0.255" //IP del servidor (A la que conectar)

  using namespace std;
  int main()
  { 

/* Primero abrimos el socket Winsock. Tenemos varias opciones para definir
el tipo de socket que vamos a crear:
        Familia del protocolo:
                AF_INET: Para conexión con máquinas conectadas a Internet
                AF-UNIX: Para conexion con máquinas LINUX
                AF_NS:   Para conexión con máquinas XEROX
                AF_CCITT:Para conexión con protocolos CCITT,X25...
        Tipo de socket:
                SOCKET_STREAM: Para TCP
                SOCKET_DGRAM:  Para UDP
                SOCKET_RAW:    Para IP
        Protocolo:
                PPROTO_TCP: Como dice su nombre, para protocolo TCP
                PPROTO_UDP: Como dice su nombre, para protocolo UDP

Así pues para una conexión UDP normal, el código sería: */

  WSADATA wsa; // Winshock
  int sock;//Descriptor del socket.
  struct sockaddr_in direccion; //Datos del servidor a conectar

  WSAStartup(MAKEWORD(2,0),&wsa);
 
  /* -Después creamos una structura (struct), en la que definiremos el tipo de
   -protocolo a utilizar para la conexion,
   -despues el puerto por el que deve conectarse nuestro cliente y
   -por último la ip a la que conectara nuestro cliente. */
   
  char buf[531];       // Tamaño del mensaje a enviar
  int puerto=6454;     // puerto del servidor a conectar

  if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1 )
     {
     // Creamos el socket mientras creamos el primer filtro de error
     printf("PROBLEMA AL CREAR EL SOCKET");
     getch();
     exit(0);
     }
  else
    {
    /* Ahora procedemos a insertar la informacion en la structura.
     *** IMPORTANTE *** Es una structura especial para socket; sin_family, sin_port .... */
   
    // **** DATOS DE LA ESTRUCTURA CON LOS DATOS DE DESTINO
    direccion.sin_family=AF_INET; // AF_inet con el protocolo UDP (Información en el paso anterior)
    direccion.sin_port=htons(puerto); //Usamos HTONS para transformar el numero de puerto a uno entendible para el socket.
    direccion.sin_addr.s_addr=inet_addr(ip); // Y agregamos la IP

    /* Despues de crear el socket y la structura con los datos pertinentes,
    podemos conectar por fin al servidor,con la funcion (connect). */
   
    /* Desglosado en partes, la línea siguiente se compone de:
    connect: Comando de conexión.
    sock: Define el socket que hemos creado en el paso 1
    struct sockaddr*:Aqui va la structura anteriormente paso 2 creada con todos los datos para conectar,ip,protocolo,puerto, (&dirrecion)
    sizeof: Utilizamos el operador sizeof para indicar la longuitud de la estructura
    Así es como queda la estructura final: connect(sock, (struct sockaddr*)&direccion,sizeof(direccion));
    */
 
  /* A continuación definimos el socket:
      Bind: Crea la definición del socket que vamos a utilizar.
      Sock: Aqui va la structura anteriormente creada (struct sockaddr_in server;)con todos los datos del servidor,ip,protocolo,puerto) &server
      Sizeof: Utilizamos el operador sizeof para obtener la longuitud de la estructura
      Y el resultado es: bind(sock,(struct sockaddr *)&server,sizeof(server));
      */
     
  struct sockaddr_in me;
  memset(&me, 0, sizeof(me));
  me.sin_family = AF_INET;
  me.sin_addr.s_addr = htonl(INADDR_ANY);
  me.sin_port = htons(puerto);
 
 
  if (!bind(sock, (struct sockaddr *)&me, sizeof(me)))
    {
    cout<<"Bind failed - error %d",(int)WSAGetLastError();
    }
    else
    {
    puts("Bind OK");
    }

  if(connect(sock,(struct sockaddr*)&direccion,sizeof(direccion))==-1)
      {//conectamos al servidor aplicando el segundo filtro:
      printf("ERROR AL CONECTAR");
      getch();
      exit(0);
      }   
 
 
  //Confirmamos el éxito de la conexión
  printf("CONECTADO CORRECTAMENTE\n\n");
 
  /*
  /////////////////////////////////////////////////////////////////////////////
  ||                                                                         ||
  ||                                                                         ||
  ||             DEFINICION DE LA CADENA DE DATOS A ENVIAR(buf)              ||
  ||                                                                         ||
  ||                                                                         ||
  /////////////////////////////////////////////////////////////////////////////
  */
 
  char total[531]; //Variable maestra en la que iremos introduciendo cada sección del paquete ArtNet Originalmente(531)
  char l_total; //Variable para introducir la suma de longitudes de los fragmentos del paquete
  char puntero; //Puntero para las operaciones de concatenación
  char cabecera[8]={65 , 114 , 116 , 45 , 78 , 101 , 116 , 0}; //Cabecera del paquete
  char opcode[2]={0, 80}; // OpCode (Originalmente 0 (El bit bajo primero) y 80)
  char version[2]={0 , 14}; //Indicador de la versión (Originalmente 0 y 14)
  char secuencia[1]={0}; //Originalmente 1
  char phisycal[1]={2}; //Subred. Originalmente 0
  char universo[2]={0 , 0}; //Define el universo en el que vamos a trabajar
  char lon_val[2]={2 , 0}; //Indice de la longitud de valores (Originalmente 2 y 0) 
  char valores[526]={255, 255, 255, 255, 0 , 0 , 0 , 0 , 0 , 0 , //1,10    //Comienza en el byte 19, termina en el byte 526
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //11-20
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //21-30
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //31-40
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //41,50
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //51,60
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //61,70
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //71,80
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //81,90
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //91,100
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //101,110   
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //111-120
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //121-130
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //131-140
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //141,150
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //151,160
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //161,170
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //171,180
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //181,190
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //191,200
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //201,210 
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //211-220
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //221-230
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //231-240
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //241,250
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //251,260
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //261,270
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //271,280
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //281,290
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //291,300
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //301,310   
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //311-320
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //321-330
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //331-340
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //341,350
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //351,360
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //361,370
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //371,380
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //381,390
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //391,400
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //401,410   
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //411-420
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //421-430
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //431-440
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //441,450
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //451,460
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //461,470
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //471,480
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //481,490
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //491,500
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //501,510
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //511,520
                    0 , 0 , 0 , 0 , 0 , 0 };                    //521,526                   
 
  //Contamos el tamaño de cada cadena para obtener el tamaño final de la cadena de trabajo.
  const unsigned int array_sizes[] = {sizeof(cabecera) , sizeof(opcode) , sizeof(version) , sizeof(secuencia) , sizeof(phisycal) , sizeof(universo) , sizeof(lon_val) , sizeof(valores)};
 
  //Definimos los arrays y punteros para concatenar las cadenas
  char *arrays[] = {
        cabecera,
        opcode,
        version,
        secuencia,
        phisycal,
        universo,
        lon_val,
        (char *) valores};
   
  unsigned int i, bytes_copiados, total_bytes;
   
  //Realizamos la copia de las cadenas
  for(i = total_bytes = 0; i < sizeof(arrays) / sizeof(char *); total_bytes += array_sizes[i], i++);
   
  char *mensaje = (char *) malloc (total_bytes);
   
  //Aplicamos un filtro de error que indique un posible overflow
  if(!mensaje){
        perror("Error al reservar memoria");
        getch();
        return 0;
  }
   
  //Aplicamos la copia con la función memcpy
  for(i = bytes_copiados = 0; i < sizeof(array_sizes) / sizeof(int); bytes_copiados += array_sizes[i], i++)
  memcpy(mensaje + bytes_copiados, arrays[i], array_sizes[i]);
   
  //Mostramos el array de almacenaje (mensaje) e introducimos los datos en la cadena final
  cout<<"Datos del paquete:"<<"\n";
  for(i = 0; i < total_bytes; i++)
        {
        printf("%d ", (unsigned char) mensaje[i]);
        buf[i]=("%d ", (unsigned char) mensaje[i]);
        }
       
  cout<<"\nTotal de bytes:"<<total_bytes<<"\n";
  //Liberamos la memoria de trabajo
  free(mensaje);
   
   //return 0;
   //Comprobamos que los datos se han transmitido correctamente al array de trabajo buf:
   
   cout<<"\n\nCOMPROBACION\n\n";
   for (i=0; i<531; i++)
       cout<<buf[i]<<" ";
 
  /*
  /////////////////////////////////////////////////////////////////////////////
  ||                                                                         ||
  ||                                                                         ||
  ||           FIN DE DEFINICION DE LA CADENA DE DATOS A ENVIAR              ||
  ||                                                                         ||
  ||                                                                         ||
  /////////////////////////////////////////////////////////////////////////////
  */


    /* Ahora que ya estamos conectados al servidor,ya podemos enviarle informacion con la funcion (send).
   
        send: definicion del socket que creamos en el paso 1
        buf:variable con la informacion a enviar
        Sizeof: Utilizamos el operador sizeof para indicar la longuitud de la variable
        Flag: lo dejamos en 0
    El resultado final: send(sock,buf,sizeof(buf),0); 
    */

      if(send(sock,buf,sizeof(buf),0)==-1)
         {
         printf("ERROR ENVIANDO");
         getch();
         exit(0);
         }

   puts("\n Mensaje enviado,pulsa una tecla para cerrar el cliente");
   getch();

   }
return 0;
}



Gracias por la ayuda ;)

Lambda

Algunas cosillas que he visto

Estas haciendo que bind "falle" al compararlo usando not (!), bind devuelve 0 cuando se completa correctamente, basicamente el programa te esta diciendo que ha fallado cuando en realidad no ha fallado, cambialo por if (bind(...) == -1) { error }

Usas connect en un socket udp (los sockets udp son connectionless), el efecto de connect en UDP es simplemente poner un destinatario por defecto para las llamadas de send, yo evitaria usar connect y usaria directamente sendto

VladisMSX1

Pues mira, no había caido en algo tan obvio como que un socket UDP no tiene sentido usar connect. Todavía soy un n00b  :-[

He hecho los cambios, cambiar el filtro del bind (dejándolo como el del connect, básicamente), he comentado el connect, y... me dice que bindea bien, que crea el socket bien, pero me da error al enviar. Os copio el código con las correcciones oportunas.


#include <conio.h>
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <winsock.h>
#define ip "192.168.0.255" //IP del servidor (A la que conectar)

  using namespace std;
  int main()
  { 

  WSADATA wsa; // Winshock
  int sock;//Descriptor del socket.
  struct sockaddr_in direccion; //Datos del servidor a conectar

  WSAStartup(MAKEWORD(2,0),&wsa);
   
  char buf[531];       // Tamaño del mensaje a enviar
  int puerto=6454;     // puerto del servidor a conectar

  if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1 )
     {
     // Creamos el socket mientras creamos el primer filtro de error
     printf("PROBLEMA AL CREAR EL SOCKET");
     getch();
     exit(0);
     }
  else
    {
    direccion.sin_family=AF_INET; // AF_inet con el protocolo UDP (Información en el paso anterior)
    direccion.sin_port=htons(puerto); //Usamos HTONS para transformar el numero de puerto a uno entendible para el socket.
    direccion.sin_addr.s_addr=inet_addr(ip); // Y agregamos la IP
     
  struct sockaddr_in me;
  memset(&me, 0, sizeof(me));
  me.sin_family = AF_INET;
  me.sin_addr.s_addr = htonl(INADDR_ANY);
  me.sin_port = htons(puerto);
 
  if (bind(sock, (struct sockaddr *)&me, sizeof(me))==-1)
    {
    cout<<"Bind failed - error %d",(int)WSAGetLastError();
    }
    else
    {
    puts("Bind OK");
    }
 
  char total[531]; //Variable maestra en la que iremos introduciendo cada sección del paquete ArtNet Originalmente(531)
  char l_total; //Variable para introducir la suma de longitudes de los fragmentos del paquete
  char puntero; //Puntero para las operaciones de concatenación
  char cabecera[8]={65 , 114 , 116 , 45 , 78 , 101 , 116 , 0}; //Cabecera del paquete
  char opcode[2]={0, 80}; // OpCode (Originalmente 0 (El bit bajo primero) y 80)
  char version[2]={0 , 14}; //Indicador de la versión (Originalmente 0 y 14)
  char secuencia[1]={0}; //Originalmente 1
  char phisycal[1]={2}; //Subred. Originalmente 0
  char universo[2]={0 , 0}; //Define el universo en el que vamos a trabajar
  char lon_val[2]={2 , 0}; //Indice de la longitud de valores (Originalmente 2 y 0) 
  char valores[526]={255, 255, 255, 255, 0 , 0 , 0 , 0 , 0 , 0 , //1,10    //Comienza en el byte 19, termina en el byte 526
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //11-20
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //21-30
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //31-40
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //41,50
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //51,60
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //61,70
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //71,80
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //81,90
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //91,100
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //101,110   
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //111-120
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //121-130
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //131-140
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //141,150
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //151,160
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //161,170
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //171,180
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //181,190
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //191,200
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //201,210 
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //211-220
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //221-230
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //231-240
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //241,250
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //251,260
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //261,270
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //271,280
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //281,290
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //291,300
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //301,310   
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //311-320
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //321-330
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //331-340
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //341,350
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //351,360
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //361,370
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //371,380
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //381,390
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //391,400
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //401,410   
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //411-420
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //421-430
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //431-440
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //441,450
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //451,460
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //461,470
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //471,480
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //481,490
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //491,500
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //501,510
                    0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,      //511,520
                    0 , 0 , 0 , 0 , 0 , 0 };                    //521,526                   
 
  const unsigned int array_sizes[] = {sizeof(cabecera) , sizeof(opcode) , sizeof(version) , sizeof(secuencia) , sizeof(phisycal) , sizeof(universo) , sizeof(lon_val) , sizeof(valores)};
 
  char *arrays[] = {
        cabecera,
        opcode,
        version,
        secuencia,
        phisycal,
        universo,
        lon_val,
        (char *) valores};
   
  unsigned int i, bytes_copiados, total_bytes;
   
  for(i = total_bytes = 0; i < sizeof(arrays) / sizeof(char *); total_bytes += array_sizes[i], i++);
   
  char *mensaje = (char *) malloc (total_bytes);
   
  if(!mensaje){
        perror("Error al reservar memoria");
        getch();
        return 0;
  }
   
  for(i = bytes_copiados = 0; i < sizeof(array_sizes) / sizeof(int); bytes_copiados += array_sizes[i], i++)
  memcpy(mensaje + bytes_copiados, arrays[i], array_sizes[i]);
   
  cout<<"Datos del paquete:"<<"\n";
  for(i = 0; i < total_bytes; i++)
        {
        printf("%d ", (unsigned char) mensaje[i]);
        buf[i]=("%d ", (unsigned char) mensaje[i]);
        }
       
  cout<<"\nTotal de bytes:"<<total_bytes<<"\n";
  free(mensaje);
   
   cout<<"\n\nCOMPROBACION\n\n";
   for (i=0; i<531; i++)
       cout<<buf[i]<<" ";

      if(send(sock,buf,sizeof(buf),0)==-1)
         {
         printf("ERROR ENVIANDO");
         getch();
         exit(0);
         }
      else
          {
           puts("\n Mensaje enviado,pulsa una tecla para cerrar el cliente");
           getch();
          }

 

   }
return 0;
}



Más que la solución en si, me gustaría saber qué ha fallado y en qué me he equivocado. Me llama la atención porque en internet todo lo que he encontrado sobre winsock era TCP y no he encontrado un solo listado de un socket UDP completo y funcional.

Gracias por la ayuda  :)

Lambda

Tienes que cambiar send por sendto

http://msdn.microsoft.com/en-us/library/windows/desktop/ms740148(v=vs.85).aspx

Y no te preocupes por los errores, todos comenzamos de la misma manera :xD

VladisMSX1

Hasta donde he entendido la sentencia Sendto, el código para mi programa debería ser:


if(sendto(sock,buf,sizeof(buf),0,(struct sockaddr*)&ip,sizeof(ip))==-1)
         {
         printf("ERROR ENVIANDO");
         getch();
         exit(0);
         }
      else
          {
           puts("\n Mensaje enviado,pulsa una tecla para cerrar el cliente");
           getch();
          }


Sin embargo, he intentado corregirlo y no deja de darme error, o bien llevándome a la librería para mostrarme la sentencia, o bien con fallos de otro tipo.

Puedo "encajar" el sendto en mi programa o tengo que reformar mas partes para poder usarlo? Porque por la forma de fallar creo que estoy intentando meter con calzador un parche en el código  :(

Lambda

Tendras que mirar por que te da error en la linea, fijate que es lo que hace la linea y las posibles razones por la que puede petar

VladisMSX1

El error que me da el sendto es -1. 

Estoy respetando la estructura del sendto, que hasta donde he investigado es:


sendto (Descriptor, (char *)&buffer, sizeof(buffer), 0, (struct sockaddr *)&Cliente, longitudCliente);

El código que yo he usado es

sendto(sock,buf,sizeof(buf),0,(struct sockaddr*)&ip,sizeof(ip))

Entiendo que el descriptor es sock, buf es la cadena que envío, luego el tamaño de la misma, el cero que he visto en todas las descripciones de internet sobre la instrucción, no se muy bien para qué es o qué define. Finalmente la estructura, la dirección de la variable de la IP a la que se conecta y la longitud de esa variable.

Me lanza continuamente error -1 y no se que puedo estar haciendo mal. Me falta algún dato o declarar alguna otra estructura?

Un saludo!

VladisMSX1

Solucioné el problema. Estaba llamando a la declaración IP cuando tenía que llamar a dirección,  con lo que la línea terminaba así:

sendto (Descriptor, (char *)&buffer, sizeof(buffer), 0, (struct sockaddr *)&Cliente, longitudCliente);

Muchas gracias por la ayuda. Si alguien necesita el código o tiene las mismas dudas que yo, espero que esto pueda servirle.

Un saludo!