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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


  Mostrar Mensajes
Páginas: 1 ... 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [28] 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 ... 83
271  Programación / Programación C/C++ / Re: Limpiar Buffer en Linux (estructuras) en: 26 Marzo 2013, 17:06 pm
Ahora mismo pasa porque no es necesario limpiar el buffer, dado que no hay basura en stdin, es una de las buenas cosas que tiene fgets... Úsalo solo cuando veas que se salta un scanf o algo.
272  Programación / Programación C/C++ / Re: Como se abre 2 terminales en un programa [windows] ? en: 26 Marzo 2013, 16:32 pm
Voy a aclarar las cosas porque yo me creía que con las pipes podía manejar cualquier proceso y no es así. Las pipes sirven para comunicar dos procesos, uno de ellos es el cliente, y otro el servidor. Lo que pasa es que hay que crear dos programas uno que mande datos por un pipe(servidor) y otro que lea datos por ese pipe y los muestre ( el cliente,una especie de stdout personalizado). Y para el de la entrada pues lo mismo. Por lo tanto los programas deben tener esto:

Servidor

  • Llamar a CreateNamedPipe(..) para crear una instancia de un pipe con nombre.
  • LLamar a ConnectNamedPipe(..) para conectar con el cliente.
  • LLamar a WriteFile(..) para enviar datos por el pipe.
  • LLamar a CloseHandle(..) para desconectar y cerrar la instancia del pipe.
Cliente

  • Llamar a CreateFile(..) para conectar el pipe.
  • Llamar ReadFile(..) para leer datos del pipe.
  • Mostrar los datos por la pantalla.
  • LLamar a CloseHandle(..) para desconectarse del pipe.

Así que ya sabes lo que tienes que hacer, no sé si hay una manera más fácil pero bueno no está mal aprender esto. Aquí te dejo un ejemplo de servidor y cliente:
Servidor:
Código
  1. ///// SERVER PROGRAM /////
  2.  
  3. #include <iostream>
  4. #include <windows.h>
  5. using namespace std;
  6.  
  7. int main(int argc, const char **argv)
  8. {
  9. wcout << "Creating an instance of a named pipe..." << endl;
  10.  
  11. // Create a pipe to send data
  12. HANDLE pipe = CreateNamedPipe(
  13. L"\\\\.\\pipe\\my_pipe", // name of the pipe
  14. PIPE_ACCESS_OUTBOUND, // 1-way pipe -- send only
  15. PIPE_TYPE_BYTE, // send data as a byte stream
  16. 1, // only allow 1 instance of this pipe
  17. 0, // no outbound buffer
  18. 0, // no inbound buffer
  19. 0, // use default wait time
  20. NULL // use default security attributes
  21. );
  22.  
  23. if (pipe == NULL || pipe == INVALID_HANDLE_VALUE) {
  24. wcout << "Failed to create outbound pipe instance.";
  25. // look up error code here using GetLastError()
  26. system("pause");
  27. return 1;
  28. }
  29.  
  30. wcout << "Waiting for a client to connect to the pipe..." << endl;
  31.  
  32. // This call blocks until a client process connects to the pipe
  33. BOOL result = ConnectNamedPipe(pipe, NULL);
  34. if (!result) {
  35. wcout << "Failed to make connection on named pipe." << endl;
  36. // look up error code here using GetLastError()
  37. CloseHandle(pipe); // close the pipe
  38. system("pause");
  39. return 1;
  40. }
  41.  
  42. wcout << "Sending data to pipe..." << endl;
  43.  
  44. // This call blocks until a client process reads all the data
  45. const wchar_t *data = L"*** Hello Pipe World ***";
  46. DWORD numBytesWritten = 0;
  47. result = WriteFile(
  48. pipe, // handle to our outbound pipe
  49. data, // data to send
  50. wcslen(data) * sizeof(wchar_t), // length of data to send (bytes)
  51. &numBytesWritten, // will store actual amount of data sent
  52. NULL // not using overlapped IO
  53. );
  54.  
  55.  
  56. if (result) {
  57. wcout << "Number of bytes sent: " << numBytesWritten << endl;
  58. } else {
  59. wcout << "Failed to send data." << endl;
  60. // look up error code here using GetLastError()
  61. }
  62.  
  63. // Close the pipe (automatically disconnects client too)
  64. CloseHandle(pipe);
  65.  
  66. wcout << "Done." << endl;
  67.  
  68. system("pause");
  69. return 0;
  70. }
Cliente:
Código
  1. ///// CLIENT PROGRAM /////
  2.  
  3. #include <iostream>
  4. #include <windows.h>
  5. using namespace std;
  6.  
  7. int main(int argc, const char **argv)
  8. {
  9. wcout << "Connecting to pipe..." << endl;
  10.  
  11. // Open the named pipe
  12. // Most of these parameters aren't very relevant for pipes.
  13. HANDLE pipe = CreateFile(
  14. L"\\\\.\\pipe\\my_pipe",
  15. GENERIC_READ, // only need read access
  16. FILE_SHARE_READ | FILE_SHARE_WRITE,
  17. NULL,
  18. OPEN_EXISTING,
  19. FILE_ATTRIBUTE_NORMAL,
  20. NULL
  21. );
  22.  
  23. if (pipe == INVALID_HANDLE_VALUE) {
  24. wcout << "Failed to connect to pipe." << endl;
  25. // look up error code here using GetLastError()
  26. system("pause");
  27. return 1;
  28. }
  29.  
  30. wcout << "Reading data from pipe..." << endl;
  31.  
  32. // The read operation will block until there is data to read
  33. wchar_t buffer[128];
  34. DWORD numBytesRead = 0;
  35. BOOL result = ReadFile(
  36. pipe,
  37. buffer, // the data from the pipe will be put here
  38. 127 * sizeof(wchar_t), // number of bytes allocated
  39. &numBytesRead, // this will store number of bytes actually read
  40. NULL // not using overlapped IO
  41. );
  42.  
  43. if (result) {
  44. buffer[numBytesRead / sizeof(wchar_t)] = '\0'; // null terminate the string
  45. wcout << "Number of bytes read: " << numBytesRead << endl;
  46. wcout << "Message: " << buffer << endl;
  47. } else {
  48. wcout << "Failed to read data from the pipe." << endl;
  49. }
  50.  
  51. // Close our pipe handle
  52. CloseHandle(pipe);
  53.  
  54. wcout << "Done." << endl;
  55.  
  56. system("pause");
  57. return 0;
  58. }

Este código y la info la he sacado de http://avid-insight.co.uk/joomla/component/k2/item/589-introduction-to-win32-named-pipes-cpp

P.D: Creo que estoy en lo cierto, si algún usuario cree que no que lo diga.
273  Programación / Programación C/C++ / Re: Limpiar Buffer en Linux (estructuras) en: 26 Marzo 2013, 16:01 pm
Con fgets no debería salirte. El prototipo de fgets es este:
Código
  1. char * fgets ( char * str, int num, FILE * stream );
Donde str es un puntero donde se van a copiar num-1 carácteres , desde el archivo que le indiques, en este caso es el estándar de entrada.
274  Programación / Programación C/C++ / Re: Como se abre 2 terminales en un programa [windows] ? en: 26 Marzo 2013, 13:32 pm
Sí si te he entendido perfectamente ahora, pues lo que se me ocurre es que crees dos procesos con CreateProcess y mediante Pipes te comuniques con el stdout de una terminal y el stdin de otra. Te dejo unos enlaces:

http://msdn.microsoft.com/en-us/library/ms682512%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365603%28v=vs.85%29.aspx

Otro enlace que tiene mejor pinta:

http://tenouk.com/cpluscodesnippet/pipeandchildprocess.html

Un código para abrir una cmd nueva, ya solo nos falta comunicarnos por ella mediante Pipes:
Código
  1. #include <windows.h>
  2. #include <tchar.h>
  3.  
  4. int _tmain(int argc, _TCHAR* argv[])
  5. {
  6.    printf("Window A\n");
  7.  
  8.    STARTUPINFO          si = { sizeof(si) };
  9.    PROCESS_INFORMATION  pi;
  10.    TCHAR               szExe[] = _T("cmd.exe"); // <-- Could be any program
  11.  
  12.    if(CreateProcess(0, szExe, 0, 0, FALSE, CREATE_NEW_CONSOLE, 0, 0, &si, &pi))
  13.    {
  14.        // optionally wait for process to finish
  15.        //WaitForSingleObject(pi.hProcess, INFINITE);
  16.  
  17.        CloseHandle(pi.hProcess);
  18.        CloseHandle(pi.hThread);
  19.    }
  20.    return 0;
  21. }
275  Programación / Programación C/C++ / Re: Limpiar Buffer en Linux (estructuras) en: 26 Marzo 2013, 13:03 pm
¿Porqué dices que no puedes usar scanf directamente? Es exactamente lo mismo:
Código
  1. #include<stdio.h>
  2. struct contacto
  3. {
  4.    char nombre[40],direccion[80];
  5.    int edad;
  6.    long telefono;
  7. };
  8. typedef struct contacto cont;
  9. int main (void)
  10. {
  11.    cont c1;
  12.    printf("Ingrese el nombre\n");
  13.    scanf("%s",c1.nombre);
  14.    printf("%s\n",c1.nombre);
  15.    return 0;
  16. }
En cuanto al gets , no deberías usarlo ya que lee una línea, que puede desbordar el array que le pasas como parámetro, al leer más caracteres de la cuenta de los que puede tener el array, así que para este caso, mi humilde opinión es usar fgets:
Código
  1. #include<stdio.h>
  2. struct contacto
  3. {
  4.    char nombre[40],direccion[80];
  5.    int edad;
  6.    long telefono;
  7. };
  8. typedef struct contacto cont;
  9. int main (void)
  10. {
  11.    cont c1;
  12.    printf("Ingrese el nombre\n");
  13.    fgets(c1.nombre,40,stdin);
  14.    printf("%s\n",c1.nombre);
  15.    return 0;
  16. }
A esto me refiero con respecto al gets:
276  Programación / Programación C/C++ / Re: ¿Me echáis un cable? en: 26 Marzo 2013, 12:52 pm
Como consejo personal para kayron8 por ahora, no te acostumbres a usar variables globales ya que recien te estas iniciando, y como muchos usan este recurso para facilitarse los ejercicios al final terminan complicandose... Igual esto es cuestion de cada uno, mientras entiendan lo que hacen esta bien


Saludos
Llevas muchísima razón, lo mejor en ese código hubiese sido esto(utilizando variables locales en las funciones):
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void metrosAPies();
  5. void piesAMetros();
  6.  
  7. int main ()
  8. {
  9.  
  10.    int eleccion = 0;
  11.    printf("CONVERSOR METROS-PIES\n");
  12.    printf("---------------------------\n");
  13.    printf("1. Metros a pies.\n");
  14.    printf("2. Pies a metros.\n");
  15.    printf("\nSelecciona numero: ");
  16.    scanf("%d",&eleccion);
  17.  
  18.    if(eleccion == 1)
  19.    {
  20.        metrosAPies();
  21.    }
  22.    else if(eleccion == 2)
  23.    {
  24.        piesAMetros();
  25.    }
  26.    else
  27.    {
  28.        printf("\nNo ha seleccionado una opcion correcta.");
  29.    }
  30.    getchar();
  31.    return 0;
  32. }
  33.  
  34. void metrosAPies()
  35. {
  36.    float metros    = 0;
  37.    float pies      = 0;
  38.    printf("\nIntroduzca los metros a convertir: ");
  39.    scanf("%f",&metros);
  40.    pies = metros / 0.3048;
  41.    printf ("\n%.2f pies son: %.2f metres\n",pies,metros);
  42. }
  43. void piesAMetros()
  44. {
  45.    float metros    = 0;
  46.    float pies      = 0;
  47.    printf("\nIntroduzca los pies a convertir: ");
  48.    scanf("%f",&pies);
  49.    metros = pies * 0.3048;
  50.    printf("\n%.2f metros son: %.2f pies\n",metros,pies);
  51. }
277  Programación / Programación C/C++ / Re: ¿Me echáis un cable? en: 26 Marzo 2013, 01:24 am
Wow, muchísimas gracias por ayudarme a resolver el problema, sabía que el ejercicio en sí, no era muy difícil.

El problema lo tengo con las funciones que no me aclaro de familiarizar con ellas.

¡Ojalá solucionase los ejercicios así de rápido!

Por cierto, en la línea 24 te dejaste el &, sino el programa peta ;)

Muchas gracias de nuevo :D

De nada, las funciones son sencillas, nada del otro mundo, lo más complicado que puedes ver ahí es la recursividad y el número variable de argumentos pero poco más . . .  ¡Que fallo! lo corrijo ahora mismo, es que hace poco he desactivado los avisos del compilador para que no me de el coñazo con algunos avisos innecesarios y se me ha olvidado activarlo.
278  Programación / Programación C/C++ / Re: problema en simple codigo en: 26 Marzo 2013, 01:16 am
Sí, cuando el programa va aumentando el valor en memoria de las variables, llega un momento según su cantidad en bits(8,16,32,64) en el cual estas llegan al punto de partida y vuelven a ser 0(o no, en este caso coincide ya que podría no coincidir si multiplicas en vez de aumentar), entonces cuando la variable numerodos sea 0, el resultado será 0 y todo se pondrá a 0.Puedes comprobarlo con este mismo código:
Código
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;
  4.  
  5. int main()
  6. {
  7.    int numerouno;
  8.    int numerodos;
  9.    int resultado;
  10.  
  11.    numerouno = 2;
  12.    numerodos = 1;
  13.    resultado = 0;
  14.  
  15.  
  16.    while (numerodos != 0 )
  17.    {
  18.        resultado = numerouno *  numerodos;
  19.        numerodos = resultado;
  20.        cout << resultado << endl;
  21.    }
  22.  
  23.    return 0;
  24. }
Lo que pasa es que llega a ese valor tan rápido que solo ves 0 y no ves los valores que ves con este programa.
279  Programación / Programación C/C++ / Re: problema en simple codigo en: 26 Marzo 2013, 00:59 am
Has creado un proyecto WIN32 y al estar intentando buscar la función principal(es la misma que el main pero cuando se va a hacer un programa de ventanas con la API de Windows):
Código
  1. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd);
No la encuentra y te lanza un error, crea un proyecto de tipo consola y pega el mismo código, verás como funciona.
280  Programación / Programación C/C++ / Re: ¿Me echáis un cable? en: 26 Marzo 2013, 00:49 am
Bien pues vamos por partes al no poder usar funciones con parámetros vamos a ser chicos malos y usaremos variables globales, a las que podremos acceder durante todo el programa. Por lo tanto lo primero que tenemos que decirle al usuario es que si quiere convertir de metros a pies o de pies a metros, luego pedirle cuantos pies o cuantos metros desea convertir y luego cuando ya tengamos la entrada, pues decidir en base a eso y llamar a las funciones:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. float metros    = 0;
  5. float pies      = 0;
  6.  
  7. void metrosAPies();
  8. void piesAMetros();
  9.  
  10. int main ()
  11. {
  12.  
  13.    int eleccion = 0;
  14.    printf("CONVERSOR METROS-PIES\n");
  15.    printf("---------------------------\n");
  16.    printf("1. Metros a pies.\n");
  17.    printf("2. Pies a metros.\n");
  18.    printf("\nSelecciona numero: ");
  19.    scanf("%d",&eleccion);
  20.  
  21.    if(eleccion == 1)
  22.    {
  23.        printf("\nIntroduzca los metros a convertir: ");
  24.        scanf("%f",&metros);
  25.        metrosAPies();
  26.        printf ("\n%.2f pies son: %.2f metres\n",pies,metros);
  27.    }
  28.    else if(eleccion == 2)
  29.    {
  30.        printf("\nIntroduzca los pies a convertir: ");
  31.        scanf("%f",&pies);
  32.        piesAMetros();
  33.        printf("\n%.2f metros son: %.2f pies\n",metros,pies);
  34.    }
  35.    else
  36.    {
  37.        printf("\nNo ha seleccionado una opcion correcta.");
  38.    }
  39.    getchar();
  40.    return 0;
  41. }
  42.  
  43. void metrosAPies()
  44. {
  45.    pies = metros / 0.3048;
  46. }
  47. void piesAMetros()
  48. {
  49.    metros = pies * 0.3048;
  50. }
Hola! LA variable pies es de tipo float sin embargo tu funcion recibe un char. Si queres ingresar un caracter tenes que declarar a pies como char y en el scanf usar %c


Saludos
Durasno de todas maneras no ingresaba ni los metros ni los pies por lo tanto siempre iba a darle 0 de salida.

¡Un saludo!

kayron8 en tu código el principal problema es que no sabías como decidir lo que el usuario quería, además debías ingresar los metros o pies que querías. Tal y como posteaste el programa pies casi nunca sería igual que 1 dado que pies casi nunca sería 'p' y entonces al pasar al bloque de sentencias del else , al ser metros 0, 0/0.3048 = 0, por lo tanto a pies se le asignaba el valor 0 y por eso todo daba 0.
Páginas: 1 ... 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [28] 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 ... 83
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines