|
431
|
Programación / .NET (C#, VB.NET, ASP) / Re: Servidor socket TCP C#
|
en: 25 Julio 2017, 22:58 pm
|
Si esque no has cambiado casi nada, solo un par de líneas. El resto, ha sido meter la función antigua (que estaba bien, salvo algunas correcciones) en la funcion Start. Sepáralas de nuevo, es bueno separar el código en funciones. Pero hayq eu distinguir bien qué es exactamente lo que va a hacer cada función. Tu función receiveData lo que hacía era recibir los datos, bien, y cerrar el socket y pedir otro cliente y recibir sus datos y etc... Eso no es una función con una utilidad clara. Limítate a hacer, por ejemplo, esto: Start: Bucle { aceptar cliente, trabajar los datos de ese cliente (llamando a receiveData } ReceiveData: Enviar y recibir datos. Nada más (no llamas a Start ni llamas recursivamente a receiveData. Si quieres recibir más datos o esperar, si tal, harás un bucle En fin, el resumen de esto es que los métodos deben tener una utilidad clara. Métodos que se llaman de forma circular (Start -> ReceiveData -> Start) pueden ser peligrosos, y en este caso en concreto, no es el momento de usarlo. Divide la función Start en pasos: Recibir cliente, manejar el cliente. Luego, si algún paso es grande (Manejar el cliente), lo mueves a un método privado. Luego, divide y analiza ese método privado.
|
|
|
432
|
Programación / .NET (C#, VB.NET, ASP) / Re: Servidor socket TCP C#
|
en: 25 Julio 2017, 13:46 pm
|
Hay varias cosas que deberías reestructurar. Una de ellas es que creas el serverSocket desde fuera. Sería más correcto que lo creases, bindeases y lo pusieras a escuchar dentro del método Start, pasándole los parámetros. Pero bueno, esto es secundario actualmente.
El principal problema es el Start y el receiveData. ReceiveData es una función recursiva. ¿Por qué? Dentro del Start la llamas en bucle, para qué hacerla recursiva. Sería preferible cambiar la recursión por un bucle. Y bueno, no solo es recursiva sino que llama a Start. Este flujo pues... ¿Esperas que la función "receiveData" acepte a otros clientes? Si quieres que tras un cliente, espere a otro, entonces pon un bucle dentro de la función Start, por ejemplo.
Y luego, en la función Start, tienes un bucle que es "while(Available == 0)". Mientras que no haya datos, leemos datos. ¿Y qué ocurre si cuando llegamos a este punto ya hay datos?
|
|
|
434
|
Programación / Programación C/C++ / Re: Error al compilar una DLL
|
en: 25 Julio 2017, 01:10 am
|
Umh bueno, acerca de eso... Code::Blocks tiene un tipo de proyecto que es Dynamic Link Library, DLL vaya. Si seleccionas ese tipo de proyecto al crearlo, te lo hace automáticamente todo esto. De todos modos, si va sa Propiedades del proyecto -> Build targets, verás que hay un selector, y una de sus opciones es "Dynamic library". En tu caso, por defecto estará puesto a "Console application", supongo. Si lo cambias ya debería estar, y ya no tendrías que poner el -shared (lo cierto es que esta opción mejor dejársela al IDE xD)
Y con respecto a si cambiándole la extension funcionará, no lo sé. Prueba jaja
|
|
|
435
|
Programación / Programación C/C++ / Re: Error al compilar una DLL
|
en: 25 Julio 2017, 00:26 am
|
Todo está bien salvo que lo pusiste en compilador. El parámetro -shared es del linker. Tú quieres que ese parámetro aparezca en la segunda parte, donde el "g++.exe -o ...". Para ello, coloca ese parámetro en la pestaña "Linker settings".
Como explicación racional a todo esto: Se puede compilar sin main un código. Generas el código de las funciones o datos que haya. El problema viene a la hora de linkear. Si quieres linkear los códigos objeto para generar un ejecutable, necesita un punto de entrada, el "main". Es por eso que da el error, al no encontrarlo. Claro que al pasarle el -shared, ya no es un ejecutable, sinó una DLL, que no lo necesita.
|
|
|
438
|
Programación / Desarrollo Web / Re: Pongo dos estilos css con <link> y se me mezclan los estilos.solucion?
|
en: 24 Julio 2017, 00:14 am
|
Si te refieres a que se aplican a elemntos que no son, entonces los CSS están mal formados. Los selectores deben ser lo más estrictos posible. Si tuvieras por ejemplo una tabla con clase "calendario" que tenga celdas con clase "dia", no basta con poner ".dia { ... }". Tienes que poner, por ejemplo, ".calendario .dia { ... }".
Si tu problema es otro, no lo entendí. ¿Qué es lo que se mezcla exactamente?
|
|
|
440
|
Programación / Programación C/C++ / Re: Cronometro c++
|
en: 22 Julio 2017, 14:37 pm
|
Si quieres saber el tiempo que ha pasado entre un punto y otro d ela ejecución, tienes clock() de la librería <ctime>, que retorna (usualmente), milisegundos: #include <ctime> int main(){ clock_t cl = clock(); // Milisegundos transcurridos hasta este momento // Pasa el tiempo... cout << (clock() - cl) << endl; // Tiempo ahora - tiempo anterior = tiempo transcurrido }
Como detalle, clock no retorna milisegundos, sino ticks del reloj. En Windows suelen ser milisegundos, pero no tiene por qué. Para tenerlo seguro, tienes la constante "CLOCKS_PER_SEC". Como detalle final, tienes la librería chrono de C++11, que es muy completa para medir tiempos. La más completa de C++ probablemente. Aquí tienes una buena referencia de ella: http://www.cplusplus.com/reference/chrono/
|
|
|
|
|
|
|