• Sábado 14 de Diciembre de 2024, 17:47

Autor Tema:  Varias Dudas  (Leído 2195 veces)

shephiroth

  • Miembro activo
  • **
  • Mensajes: 30
    • Ver Perfil
Varias Dudas
« en: Miércoles 21 de Enero de 2004, 21:36 »
0
Pues eso, tengo dos problemas y me gustaría a ver si me podeis ayudar.

El primero no es muy complicado, simplemente me gustaría saber como recorrer cada uno de los caracteres de un String. La unica solucion que me han dado hasta ahora es escribir el string en un fichero de texto, y leerlo caracter a caracter. Esta solucion en principio estaría bien, pero teniendo en cuenta que el proceso va a ser repetitivo el tiempo de ejecución aumentaría en sobremanera, por lo que es una opcion "poco" viable. A ver si alguien sabe como solucionar esto xDD.

El siguiente es un tema más complicado. Me gustaría conocer un poco el tema de conexiones de Sockets, para hacer una aplicacion cliente/servidor sencillita en un principio, y luego ya se verá. Demomento he visto por inet y el codigo que he encontrado es el siguiente:

Código: Text
  1.  
  2. WSADATA g_DatosWS;
  3. SOCKET g_Socket;
  4. sockaddr_in g_DirRemota;
  5. sockaddr g_DirRemot;
  6. if(WSAStartup(MAKEWORD(1, 1), &g_DatosWS) != 0)
  7. {
  8.     Console::WriteLine("ERROR NO SE PUDO HACE NA");
  9. }
  10. else
  11. {
  12.     g_Socket = socket(AF_INET, SOCK_STREAM, 0);
  13.     if(g_Socket == INVALID_SOCKET)
  14.   Console::WriteLine("No puedo crear el socket");
  15.     else
  16.     {
  17.   g_DirRemota.sin_addr.s_addr = inet_addr("192.168.X.X");
  18.   g_DirRemota.sin_port = htons(80);
  19.   if (connect(g_Socket,g_DirRemota,??)==0)
  20.     Console::WriteLine("Conexion establecida correctamente");
  21.   else
  22.     Console::WriteLine("Fallo en el ultimo momento");
  23.     }
  24. }
  25.  
  26.  
Pero el problema que tengo en este codigo es justo en la funcion Connect, puesto que el segundo parametro debería ser sockaddr y en el manual que tengo utiliza sockaddr_in (y no lo convierte automaticamente). Despues tengo problema con el tercer argumento, que se supone es el el tamaño pero ni idea de como hayarlo xDD.

Si alguien me puede ayudar se lo agradeceré ^_^

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Varias Dudas
« Respuesta #1 en: Jueves 22 de Enero de 2004, 11:25 »
0
Hola.

Si tienes una cadena del tipo std::string y quieres recorrerla caracter a caracter como si se tratara de un vector de tipo char has de usar el método c_str(). Este método devuelve un puntero al buffer en donde se guarda la cadena, por lo que te puedes referir a una posición en concreto usando [].

Respecto al uso de connect, has de hacerlo así:
Código: Text
  1.  
  2. connect(g_Socket, (struct sockaddr *) &g_DirRemota, sizeof(g_DirRemota))
  3.  
  4.  
De esta manera te funcionará perfectamente.

Espero que te haya servido de ayuda.

Un saludo.

Ruben3d

shephiroth

  • Miembro activo
  • **
  • Mensajes: 30
    • Ver Perfil
Re: Varias Dudas
« Respuesta #2 en: Jueves 22 de Enero de 2004, 11:38 »
0
Buenas. Lo primero darte las gracias por sendas respuestas. La primera no me sirve puesto que utilizo System::String en vez de std::string, si tienes alguna otra solucion...pero gracias ^_^.

Respecto al socket, gracias asi en principio compila xDD aunque ya encontré ayer un manual que viene bastante bien explicado. He de crear una clase que herede de la clase CSocket y ya tengo todo solucionado xDD

Pero gracias. xDD

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Varias Dudas
« Respuesta #3 en: Jueves 22 de Enero de 2004, 14:48 »
0
Mira a ver si esto te sirve:
http://longhorn.msdn.microsoft.com/lhsdk/r...ng/p/chars.aspx

Pertenece al SDK de Longhorn, pero no creo que sea diferente al managed c++ actual.

Un saludo.

Ruben3d

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Varias Dudas
« Respuesta #4 en: Jueves 22 de Enero de 2004, 14:56 »
0
Bueno, parece que sí es un poco diferente  :whistling:

He buscado en la referencia de microsoft y he encontrado esta propiedad de System::String.

Código: Text
  1.  
  2. [C++]
  3. [Serializable]
  4. public: __property __wchar_t get_Chars(
  5.    int index
  6. );
  7.  
  8.  

Espero que esta te sirva.

Un saludo.

Ruben3d

shephiroth

  • Miembro activo
  • **
  • Mensajes: 30
    • Ver Perfil
Re: Varias Dudas
« Respuesta #5 en: Jueves 22 de Enero de 2004, 17:41 »
0
No, no sirve. Estoy en una clase administrada, asi ue si intento poner
constant __wchar_t misChar;
misChar=miString->getChars();
me salta un error al compilar que me indica que no se reconoce como funcion, y por lo tanto no rula de ninguna manera.

Alguna idea mas??

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Varias Dudas
« Respuesta #6 en: Jueves 22 de Enero de 2004, 18:37 »
0
Acabo de hacer un programa como te he dicho y funciona muy bien. Mira:

Código: Text
  1.  
  2. //
  3. // main.cpp
  4. //
  5.  
  6. #using <mscorlib.dll>
  7.  
  8. using namespace System; // String, Console
  9.  
  10. void main()
  11. {
  12.     String __gc* cadena("Cadena de caracteres");
  13.  
  14.     for (unsigned int i=0; i<cadena->Length; i++)
  15.   Console::WriteLine(cadena->get_Chars(i));
  16.  
  17.     Console::ReadLine();
  18. }
  19.  
  20.  

El resultado por pantalla es la cadena de texto escrita en vertical.

Un saludo.

Ruben3d

mquell

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Varias Dudas
« Respuesta #7 en: Martes 9 de Noviembre de 2004, 17:23 »
0
Buenas tardes
shephiroth, comentabas que habías encontrado un manual muy bueno sobre socket, te quería pedir si podrías enviármelo.
Un saludo.