|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - Ruben3d
Páginas: 1 ... 26 27 [28] 29 30
676
« en: Miércoles 25 de Febrero de 2004, 16:22 »
Hola.
¿Te estás refiriendo a hacerlo a muy bajo nivel, sin usar sockets?
Ruben3d
677
« en: Martes 24 de Febrero de 2004, 17:52 »
Tengo un vector de 8 posiciones y lo declaro como constante. ¿Como hago para rellenarlo con los datos que quiera? (una secuencia de numeros desordenados).
int vector[8]; int i; for (i=0; i<8; i++) { scanf("%d", &vector[i]); }
La función debería tener un aspecto similar a este (te lo pongo en pseudocódigo): // n es el tamaño void ShellSort(tipo_dato *vector, int n) { int h, j; tipo_dato tmp; h = n/2; while (h>0) // Realiza las pasadas { int i; for (i=h; i<n; i++) { tmp = vector[i]; j = i; while (j-h > 0) { if (tmp < vector[j-h]) { vector[j] = vector[j-h]; j = j-h; } else break; } a[j] = tmp; } h = h/2; } }
Bueno, me ha salido más bien código normal. No te aseguro que la función compile a la primera ni que haya definido bien los límites (en los bucles), pero la idea general es esa (según una antigua función que tengo en pascal). Un saludo. Ruben3d
678
« en: Martes 24 de Febrero de 2004, 16:19 »
Hola. Para realizar la ordenación Shell has de elegir primeramente un incremento. El propuesto por Shell es h = n/2, donde n es el número de elementos del vector. Una vez elegido el incremento h, el algoritmo lo dividirá entre dos en cada iteración, hasta que sea 1. Así, tendrá este aspecto: h = n do { h = h / 2 ... hace una pasada ... } while (h > 1)
Lo que vamos a hacer en cada pasada es ordenar por inserción h subvectores. Cada vector se puede definir como - Vk = { Ni / i = m*h+k }, i,k,m naturales positivos, k<h</li>
Esto como mejor se ve es con un ejemplo (he tabulado los subvectores para que se vea claramente cómo se generan): Vector: 3 7 2 3 5 8 6 5 3 6 7 9 Tamaño: 12 h inicial: 6=12/2 Subvectores: V0: 3 6 V1: 7 5 V2: 2 3 V3: 3 6 V4: 5 7 V5: 8 9
En la siguiente iteración los vectores que se generarían son (hay que tener en cuenta que no los he ordenado, pero se supone que se tiene que ordenar cada uno independientemente por inserción): Vector: 3 7 2 3 5 8 6 5 3 6 7 9 Tamaño: 12 h: 3 = 6/2 Subvectores: V0: 3 3 6 6 V1: 7 5 5 7 V2: 2 8 3 9
Creo que con esta explicación ya no te será difícil implementar la ordenación Shell. Un saludo. Ruben3d
679
« en: Lunes 23 de Febrero de 2004, 21:36 »
Hola. Para hacer lo que dices hice este código hace ya algún tiempecillo. void CalcularTiempo(void) { static float tiempoAnterior = Timer.GetTime(); float tiempoActual = Timer.GetTime(); CfgSistema.time = (tiempoActual - tiempoAnterior) * 0.001f; // Lo paso a segundos tiempoAnterior = tiempoActual; }
Puedes sustituir Timer.GetTime() por alguna función de Windows, como timeGetTime(). El tiempo de cada fotograma (en segundos) queda almacenado en este ejemplo en la variable global CfgSistema.time. Has de llamar a esta función una vez en cada fotograma, siempre en el mismo punto. Para saber las FPS has de calcular la inversa de CfgSistema.time. Espero que te sirva. Un saludo. Ruben3d
680
« en: Lunes 23 de Febrero de 2004, 21:09 »
Se me acaba de ocurrir cómo computar eficientemente si el centro del círculo está en el interior del cuadrilátero aprovechando que se trata de un juego en vista isométrica. En un juego de este tipo, el cuadrilátero será un rombo, con este aspecto: B /\ / \ A / .O \ \ / C \ / \/ D
donde A, B, C, D y O son puntos. Viendo el dibujo podemos observar que A y C están a la misma altura, alineados con O. También están alineados B, O y D. Aprovechando esta característica se puede saber con pocos cálculos si el punto está en el interior del rombo realizando subdivisiones del espacio: - Se calcula si el punto está a la izq. o a la dcha. de la recta BD (eficiente, pues está alineada con el eje Y). Esto nos divide el espacio en dos subespacios.</li>
- Calcular si el punto está encima o debajo de la recta AC (también eficiente). Esto nos divide el subespacio en el que estemos en otros dos.</li>
- Llegados a este punto, en el subespacio que estemos sólo habrá una recta: AB, BC, CD ó DA. Dependiendo de en el subespacio que estemos, habrá que saber si estamos encima o debajo de la recta.</li>
- Construimos la ecuación punto-pendiente de la recta correspondiente y sustituimos el valor de la componente X del punto.</li>
- Ya solo resta comparar el resultado con el valor de la componente Y del punto para saber si está encima o debajo de la recta.</li>
De esta manera, sólo hay que realizar un cálculo complejo para uno de los segmentos, en vez de los cuatro. Espero no haber metido la pata en ningún lado. Un saludo. Ruben3d
681
« en: Lunes 23 de Febrero de 2004, 20:37 »
calcular la distancia entre los centros de ambas figuras y que esa distancia también sea mayor al radio del círculo.
Esta solución para el caso particular falla si el círculo es considerablemente más pequeño que el cuadrilátero. Para ilustrarlo, pongo un ejemplo simple con un rectángulo de lados paralelos a los ejes: +---------------------------------+ | | | | | _ | | / \ | | | | | | \_/ | +---------------------------------+
Como se puede observar (a pesar de mi habilidad haciendo dibujos en ASCII) el centro del círculo cumple la condición de estar más alejado del centro del rectángulo que el tamaño del radio, por lo que no habría colisión, cuando en verdad sí la hay. Creo que la solución pasaría por determinar si el centro del círculo está en el interior del cuadrado. Esto es bastante fácil si el rectángulo está alineado con los ejes, pero si no lo está el proceso es bastante más costoso computacionalmente hablando. Un saludo. Ruben3d
682
« en: Lunes 23 de Febrero de 2004, 20:06 »
Hola.
Prueba a cambiar el tipo de la variable c a unsigned char. Tambien podrías probar a cambiar printf("data = %d\n", c); por printf("data = %u\n", c);.
Creo que el problema está en que c es de tipo int, ocupando 4 bytes y no estando inicializado. Sin embargo, cuando lees el valor sólo lees un byte, por lo que se quedan sin modificar los otros 3, y a saber qué había en ellos. Además, con printf estás escribiendo un entero con signo, cuando deberías escribir uno sin signo.
un saludo.
Ruben3d
683
« en: Domingo 22 de Febrero de 2004, 13:56 »
Hola. Lo que pides puedes hacerlo de dos formas: mediante CreateProcess o mediante spawn. Aqui te dejo un ejemplo de cada uno, sacado de MSDN: Creating a process in Windows using CreateProcess #include <windows.h> #include <process.h> #include <stdio.h> void main() { STARTUPINFO si; PROCESS_INFORMATION pi; GetStartupInfo(&si); printf("Running Notepad with CreateProcess\n"); CreateProcess(NULL, "notepad", // Name of app to launch NULL, // Default process security attributes NULL, // Default thread security attributes FALSE, // Don't inherit handles from the parent 0, // Normal priority NULL, // Use the same environment as the parent NULL, // Launch in the current directory &si, // Startup Information &pi); // Process information stored upon return printf("Done.\n"); exit(0); }
Creating a process in Windows using spawn #include <windows.h> #include <process.h> #include <stdio.h> void main() { printf("Running Notepad with spawnlp\n"); _spawnlp( _P_NOWAIT, "notepad", "notepad", NULL ); printf("Done.\n"); exit(0); }
Espero que te sirva. Un saludo. Ruben3d
684
« en: Sábado 21 de Febrero de 2004, 13:28 »
Hola. Para poder saber si un círculo ha colisionado con un cuadrado (o rectángulo o cualquier cuadrilátero en general) se me ocurre que podrías hacer lo siguiente: - Tener representado el cuadrado por sus 4 vértices y sus 4 aristas.</li>
- Calcular la distancia desde cada arista al centro del círculo.</li>
- Si la distancia es menor que el radio del círculo, entonces hay colisión.</li>
Espero que te sirva, un saludo. Ruben3d
685
« en: Viernes 13 de Febrero de 2004, 14:39 »
Hola.
Es muy sencillo. Le das a Archivo->Proyecto->Nuevo.
Pinchas en la pestaña Multimedia y le das a OpenGL.
Esto te creará un nuevo proyecto que crea una ventana en la que pinta un triángulo rotando usando OpenGL.
Un saludo.
Ruben3d
687
« en: Lunes 9 de Febrero de 2004, 22:41 »
Hola.
Ese cambio no funcionará, ya que la declaración de la función indica que hay que pasar un puntero a un entero, no un entero, por lo que hay que obtener su dirección con & . Además, si dentro de la función usas el puntero directamente, sin desreferenciarlo con *, lo que haces es cambiar la dirección de memoria a la que apunta. Por ejemplo, si el puntero vale 0x4DF2 y en esa dirección de memoria hay un int (que es el valor que queremos), al incrementarlo en uno valdrá 0x4DF6 (aumenta 4 bytes, que es el tamaño de un int) y no sabremos a qué está apuntando, por lo que puedes acabar, con suerte, con una violación de segmento y, si no tienes tanta suerte, puede compilar perfectamente, pero modificar el valor de otra variable (imagina para encontrar el fallo).
Espero que esto te lo haya aclarado un poco más.
Un saludo.
Ruben3d
688
« en: Lunes 9 de Febrero de 2004, 14:57 »
Hola. Quería aportar mi opinión también a esta discusión. A parte de lo ya dicho en los posts anteriores quería comentar algunos detalles. "la lentitud" de java (cosa que en mi opinión se puede solucionar con threads)
No veo cómo los threads van a incrementar la velocidad de ejecución de un programa en una máquina monoprocesador. Es más, si no se tiene cuidado, la sincronización de variables compartidas puede formar un cuello de botella en el pipeline de tu motor 3d por excesivas dependencias. aparte del cobol y el fortran de la universidad, es el único lenguaje que conozco y me gustaría tratar de programar un videojuego en java
A mi me han enseñado Pascal, Caml, Java, C orientado a la programación de comunicaciones en Linux, Lisp y Prolog. Menudo cuadro para hacer videojuegos . Eso no quita que yo por mi cuenta haya profundizado en C y estudiado C++ para aprovechar todas las características de este lenguaje. Un detalle importante con respecto a Java nadie lo ha mencionado: El lenguaje es polimórfico. En C++ ésto es una opción: se puede declarar explícitamente un método como virtual o no, dependiendo de si se quiere polimorfismo o no. El polimorfismo simplifica el código, pero también añade sobrecarga en la ejecución por tener que estar buscando el la VTABLE de la clase al hacer una llamada a un método. Una alternativa son las templates de C++, que no añaden sobrecarga (la STL está implementada de esta manera). Por último, decir que no es imposible la creación de un motor 3d en Java. Un ejemplo de esto es Java is Doomed ( http://sourceforge.net/projects/javaisdoomed/), que usa OpenGL y carga modelos md2. Un saludo. Ruben3d
689
« en: Sábado 7 de Febrero de 2004, 01:06 »
Hola.
El UML, como su nombre indica, es un lenguaje de modelado unificado. Al contrario que con la notación de los diagramas relacionados con la programación estructurada, que varía de autor a autor y de herramienta CASE a herramienta CASE, UML nación con el objetivo de estandarizar los diagramas empleados en POO, para evitar confusiones relacionadas con la notación.
Así, UML sólo define la notación de un número de diagramas (de actividades, de interacción (secuencia y colaboración), de casos de uso, de clases, de transición de estados, de dispersión, de componentes y de objetos - creo que no se me olvida ninguno). De ésta forma, cuando un autor diga: "diagrama de clases", todo el que conozca UML sabrá cómo hacerlo e interpretarlo.
Sin embargo, UML no es más que eso: un estándar para la notación de diagramas. La metodología a seguir para desarrollar un sistema de información utilizará estos diagramas. Mundialmente conocida es Unified Process (Proceso Unificado), desarrollada por la gente de Rational, y basada en los diagramas de UML. También puedo mencionar Métrica 3, la metodología desarrollada por el gobierno español para la elaboración de software para el estado.
Por ello, a la hora de elaborar un software, es importante elegir la metodología que más se adapte a las necesidades, que indicará qué diagramas realizar en cada momento.
Un saludo.
Ruben3d
690
« en: Sábado 7 de Febrero de 2004, 00:51 »
Hola. Existe un programa, llamado miniterm, que lo que hace es enviar por el puerto serie lo que escribas, carácter a carácter, y escribir por pantalla lo que reciba, también carácter a carácter. Su código es /* * AUTHOR: Sven Goldt (goldt@math.tu-berlin.de) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ /* This is like all programs in the Linux Programmer's Guide meant as a simple practical demonstration. It can be used as a base for a real terminal program. */ #include #include #include #include #include #define BAUDRATE B38400 #define MODEMDEVICE "/dev/ttyS1" #define ENDMINITERM 2 /* ctrl-b to quit miniterm */ #define _POSIX_SOURCE 1 /* POSIX compliant source */ #define FALSE 0 #define TRUE 1 volatile int STOP=FALSE; void child_handler(int s) { STOP=TRUE; } main() { int fd,c; struct termios oldtio,newtio,oldstdtio,newstdtio; struct sigaction sa; /* Open modem device for reading and writing and not as controlling tty because we don't want to get killed if linenoise sends CTRL-C. */ fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY); if (fd <0) {perror(MODEMDEVICE); exit(-1); } tcgetattr(fd,&oldtio); /* save current modem settings */ /* Set bps rate and hardware flow control and 8n1 (8bit,no parity,1 stopbit). Also don't hangup automatically and ignore modem status. Finally enable receiving characters. */ newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD; /* Ignore bytes with parity errors and make terminal raw and dumb. */ newtio.c_iflag = IGNPAR; /* Raw output. */ newtio.c_oflag = 0; /* Don't echo characters because if you connect to a host it or your modem will echo characters for you. Don't generate signals. */ newtio.c_lflag = 0; /* blocking read until 1 char arrives */ newtio.c_cc[VMIN]=1; newtio.c_cc[VTIME]=0; /* now clean the modem line and activate the settings for modem */ tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio); /* Strange, but if you uncomment this command miniterm will not work even if you stop canonical mode for stdout. This is a linux bug. */ tcsetattr(1,TCSANOW,&newtio); /* stdout settings like modem settings */ /* next stop echo and buffering for stdin */ tcgetattr(0,&oldstdtio); tcgetattr(0,&newstdtio); /* get working stdtio */ newstdtio.c_lflag &= ~(ICANON | ECHO); tcsetattr(0,TCSANOW,&newstdtio); /* terminal settings done, now handle in/ouput */ switch (fork()) { case 0: /* child */ /* user input */ close(1); /* stdout not needed */ for (c=getchar(); c!= ENDMINITERM; c=getchar()) write(fd,&c,1); tcsetattr(fd,TCSANOW,&oldtio); /* restore old modem setings */ tcsetattr(0,TCSANOW,&oldstdtio); /* restore old tty setings */ close(fd); exit(0); /* will send a SIGCHLD to the parent */ break; case -1: perror("fork"); tcsetattr(fd,TCSANOW,&oldtio); close(fd); exit(-1); default: /* parent */ close(0); /* stdin not needed */ sa.sa_handler = child_handler; sa.sa_flags = 0; sigaction(SIGCHLD,&sa,NULL); /* handle dying child */ while (STOP==FALSE) /* modem input handler */ { read(fd,&c,1); /* modem */ write(1,&c,1); /* stdout */ } wait(NULL); /* wait for child to die or it will become a zombie */ break; } }
Espero que te sirva. Un saludo. Ruben3d
691
« en: Viernes 6 de Febrero de 2004, 16:51 »
Es válido la declaracion de variables referencia en C?
No, es específico de C++. Creo que en la pregunta original se refería al paso de parámetros a funciones "por referencia", cosa que ya he explicado un par de post más arriba (debajo del grandote). Un saludo. Ruben3d
692
« en: Viernes 6 de Febrero de 2004, 14:57 »
Meditando, creo que Jordi-18 con "paso por referencia" se refiere al paso por referencia estándar de C y no a las referencias de C++. El post anterior se queda para las generaciones venideras que quieran saber sobre C++ Para pasar un parámetro por referencia (y poder modificarlo) a una función has de pasar su dirección de memoria y, dentro de la función, desreferenciar el puntero para modificarlo. Mira estos ejemplos: // Función desde la que no se puede modificar void Func1(int num) { num = num + 1; printf("Dentro de Func1: %d\n", num); } // Función que sí modifica void Func2(int *num) { *num = *num + 1; printf("Dentro de Func2: %d\n", *num); } // Ejemplo de su uso x = 1; Func1(x); // Desde aqui dentro se imprimirá 2 printf("Tras llamar a Func1: %d\n", x); // Imprimirá 1 Func2(&x); // Desde aqui se imprimirá 2 printf("Tras llamar a Func2: %d\n", x); // Imprimirá 2
Espero que con esto te quede claro el paso por referencia. Un saludo. Ruben3d
693
« en: Viernes 6 de Febrero de 2004, 14:33 »
Hola. Operadores De Indirección (*), De Dirección (&)..., ... y paso por referencia
A CiRRuS le ha faltado explicarte lo de las referencias. Una referencia es como un puntero que se desreferencia automáticamente y que no puede ser redirigido. Un ejemplo de esto sería: int x = 3; int& y = x; // y es una referencia a x int* z = &x; // z es un puntero a x
Aqui declaras una variable x con el valor 3. A continuación declaras una referencia a x, llamada y, cuyo valor es la dirección de memoria de x (fijate que no hay que escribir explicitamente el operador & para obtener la dirección de x, ya que el compilador se da cuenta de que se está inicializando una referencia y lo hace automáticamente). En los ejemplos también pongo un puntero, para que se vea la diferencia. Cuando te quieras referir al 3 puedes hacerlo de dos formas (más la del puntero): cout << "x: " << x << endl; cout << "y: " << y << endl; // Usando un puntero cout << "z: " << *z << endl;
Las tres líneas producirán un 3 por pantalla. Ahora bien, a la hora de modificar el 3 se puede hacer por medio de la referencia, sin tener que desreferenciar con * (como he tenido que hacer con el puntero): x = 4; cout << "Valor de x: " << x << endl; // Imprimirá 4 y = 5; cout << "Valor de x tras cambiarlo a traves de y: " << x << endl; // Imprimirá 5
Ahora bien, ¿de qué nos vale esto? La respuesta es el paso de parámetros a funciones. De esta manera podemos pasar objetos a funciones por su dirección de memoria sin tener que realizar una copia de ellos y no teniendo que obligar al programador que use la función a poner explicitamende el operador & : // Función que recibe una referencia void MiFunc(const int& num) { cout << "He recibido un " << num << endl; } // Ejemplo de uso int x = 5; MiFunc(x);
La ganancia no queda clara con un int, pero si le pasamos un parámetro que sea un objeto de gran tamaño (imagina una lista de gran tamaño de ojetos complejos) el ahorro de tiempo y espacio al no tener que hacer el duplicado es considerable. Esto también puede usarse para modificar el parámetro, si no ponemos el const: // Función que modifica el parámetro void MiFunc(int& num) { num += 1; } // Ejemplo de uso int x = 5; cout << "x=" << x << endl; // Imprime "x=5" MiFunc(x); cout << "x=" << x << endl; // Imprime "x=6"
Espero que con esto te hayan quedado claras las referencias. Tienen más usos, como en sobrecargas de operadores, donde se pueden aprovechar para poder encadenarlos, pero creo que esto es suficiente a modo introductorio. Un saludo. Ruben3d PD: Si he cometido algún error que alguien me avise!
694
« en: Viernes 6 de Febrero de 2004, 14:03 »
Hola. Este programa funciona, así que pruebalo para descartar que tengas un problema de configuración (bajo Windows, claro). #include <windows.h> int main() { Sleep(2000); // Espera dos segundos return 0; }
Un saludo. Ruben3d
695
« en: Viernes 6 de Febrero de 2004, 13:52 »
Que me aconsejan, como doy el primer paso?.
En mi opinión, el primer paso es conocer bien el lenguaje que se va a emplear, alguna librería gráfica, para pintar por pantalla, y hacer un juego sencillo: un tetris, un arkanoid, un space invaders o juegos por el estilo. Ahora bien, hacer el juego completo: Pantalla de presentación, menú del juego... No hacer que se entre directamente en el juego y al perder o ganar te mande fuera. Así, con juegos sencillos completos (quiero resaltar completos) vas a aprender más de lo que te imaginas, ya que irás perfeccionando un engine para hacer tus juegos. Que es lo que necesito para crear un buen engine.
Una palabra: Experiencia. Un engine de un juego (y más de un juego 3d de los que hay ahora) conlleva una inmensa cantidad de decisiones sobre su arquitectura, que sólo pueden ser tomadas correctamente si tienes experiencia en el diseño de engines. Después de que hagas algún juego sencillo examinalo e identifica qué partes reutilizarías para otro juego. Cuando hagas otro juego, intenta diseñarlo de manera que sólo haya que programar entre juego y juego la lógica de éstos. La parte que tengas en común será el engine. Alguna pagina, algun ejemplo algo porfavor.
http://nehe.gamedev.net - Aqui tienes muchos tutoriales sobre OpenGL. http://www.gametutorials.com - Muchísimos tutoriales de OpenGL, DirectX, Redes, Win32... http://sourceforge.net - Entra en "software map", dale a la categoría de "Games" y dentro de ésta dale a "First Person Shooters". Allí tienes una gran cantidad de engines 3d, de código abierto, para que puedas examinarlos. Espero que con esta información te puedas ir guiando. Si tienes alguna duda o quieres que te aclare algo pregunta. Un saludo. Ruben3d
696
« en: Viernes 6 de Febrero de 2004, 13:27 »
Muchas gracias por toda la información.
Un saludo.
Ruben3d
697
« en: Miércoles 4 de Febrero de 2004, 10:37 »
Estoy usando C++, así que creo que me decantaré por DirectDraw. Me pondré a investigar sobre cómo usarlo para conseguir lo que quiero. Muchas gracias por tus respuestas! Un saludo. Ruben3d
698
« en: Martes 3 de Febrero de 2004, 21:13 »
Hola! Gracias por la respuesta. Después de haberla leido me quedan algunas dudas: - Si DirectX usa GDI, y Allegro usa DirectX, ¿la librería más eficiente es GDI? - En el código que has puesto en el foro de C++ parace que el contexto del dispositivo (hdc) hace de PrimaryBuffer, y creas un BackBuffer que copias al Primary llamado (hdcmem) usando BitBlt(). ¿Es esto así? - ¿Puedo pintar píxeles en hdcmem de la manera que he expuesto en el primer post? - ¿Quedaría algo más claro el código si se usara DirectDraw, aunque esté basado en GDI? Espero que no sean demasiadas preguntas Muchas gracias. Ruben3d
699
« en: Martes 3 de Febrero de 2004, 19:24 »
Hola a todos. Me gustaría saber qué librería gráfica debería utilizar bajo Windows para poder pintar píxeles de la forma más eficiente. Me explicaré un poco más. Me gustaría que la librería me permitiera crear un primary buffer y un backbuffer, en el que pintar. Y permitirme intercambiar los contenidos para evitar el parpadeo. Además, me gustaría que soportara al menos 16 bits de color y un direccionamiento lineal para el backbuffer, lo que me permitiría pintar los píxeles más o menos así: PintarPixel(x,y, color) { backbuffer[x+y*anchuraPantalla] = color; // backbuffer es un puntero al backbuffer }
He estado buscando por internet y algunas de las librerías que creo que permiten esto son (corregidme si me equivoco): - DirectDraw</li>
- OpenGL (API 3D, he hecho pruebas y es muy ineficiente para esto, lo descarto)</li>
- SDL</li>
- Allegro </li>
- GDI (¿permite backbuffer?)</li>
¿Alguien me podría decir con cuál de estas librerías se podría implementar esto de la manera más sencilla y eficiente posible? Muchas gracias. Ruben3d
700
« en: Martes 3 de Febrero de 2004, 18:48 »
Hola. Por tu pregunta deduzco que tienes el código de un servidor y que, cuando aceptas una conexión, quieres saber desde qué dirección IP viene y qué puerto. Si te fijas, la sintaxis de accept (para aceptar conexiones entrantes por TCP) es: int accept(int s, struct sockaddr *sa, int *addrlen);
Para aceptar una conexión se haría así: struct sockaddr_in sa; int size_sa = sizeof(sa); int cliente = accept(mi_socket_tcp, (struct sockaddr *) &sa, &size_sa);
Después de esto, en cliente tendrías el descriptor de la conexión que acabas de hacer y en sa tendrías la dirección IP y el puerto de donde proviene. Para obtener los valores del struct, que estarán en el formato de la red, se hace así: // Retorna la dirección IP en formato de cadena char *inet_ntoa(sa.sin_addr); // Retorna el puerto con los bytes bien ordenados unsigned short ntohs(sa.sin_port);
Espero que te haya servido de ayuda. Un saludo. Ruben3d
Páginas: 1 ... 26 27 [28] 29 30
|
|
|