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:
Gracias por la ayuda
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 [Seleccionar]
/*
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