Autor
|
Tema: Asignar puerto fuente en Winsock (Leído 4,526 veces)
|
VladisMSX1
Desconectado
Mensajes: 12
|
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!
|
|
|
En línea
|
|
|
|
Lambda
|
Prueba usar bind en el socket con la ip como INADDR_ANY y el puerto de origen que tu quieras
|
|
|
En línea
|
|
|
|
VladisMSX1
Desconectado
Mensajes: 12
|
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 
|
|
|
En línea
|
|
|
|
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
|
|
|
En línea
|
|
|
|
VladisMSX1
Desconectado
Mensajes: 12
|
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 
|
|
|
En línea
|
|
|
|
|
VladisMSX1
Desconectado
Mensajes: 12
|
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 
|
|
|
En línea
|
|
|
|
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
|
|
|
En línea
|
|
|
|
VladisMSX1
Desconectado
Mensajes: 12
|
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!
|
|
|
En línea
|
|
|
|
VladisMSX1
Desconectado
Mensajes: 12
|
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!
|
|
|
En línea
|
|
|
|
|
|