elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


  Mostrar Mensajes
Páginas: 1 [2]
11  Programación / Programación C/C++ / Re: Asignar puerto fuente en Winsock en: 3 Mayo 2012, 10:59 am
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:

Código:
/*
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 ;)
12  Programación / Programación C/C++ / Asignar puerto fuente en Winsock en: 27 Abril 2012, 10:40 am
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!
Páginas: 1 [2]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines