• Domingo 28 de Abril de 2024, 16:44

Autor Tema:  Re: Comunicación Por Sockets  (Leído 10940 veces)

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #25 en: Jueves 6 de Diciembre de 2007, 20:59 »
0
Los unicos cambios que hice son los que te conte, diferencias pueden ser millones, desde la version al el service pack de Windows, que usas otro compilador, etc, etc.

Depura (o usa alguna cadena para mostrar en pantalla) los puntos donde es crean, se cierran y se usan los sockets. Es la unica forma de comprender el problema realmente.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #26 en: Viernes 7 de Diciembre de 2007, 00:53 »
0
Estoy intentando probar el código en otro compilador. He bajado la versión gratuita del visual c++. Microsoft Visual Studio 2008 Version 9.0.21022.8 RTM

No logro compilar ya que aparecen un montón de errores, y me imagino que será debido a que no están incluidas algunas librerias en el proyecto.

Código: Text
  1. 1>------ Build started: Project: ProyectoFC, Configuration: Debug Win32 ------
  2. 1>Compiling...
  3. 1>SOCKET.cpp
  4. 1>C:\Dev-Cpp\include\WinSock2.h(53) : error C2011: 'fd_set' : 'struct' type redefinition
  5. 1>        C:\Archivos de programa\Microsoft SDKs\Windows\v6.0A\include\winsock.h(68) : see declaration of 'fd_set'
  6. 1>C:\Dev-Cpp\include\WinSock2.h(101) : error C2011: 'timeval' : 'struct' type redefinition
  7. 1>        C:\Archivos de programa\Microsoft SDKs\Windows\v6.0A\include\winsock.h(111) : see declaration of 'timeval'
  8. 1>C:\Dev-Cpp\include\WinSock2.h(109) : warning C4005: 'timercmp' : macro redefinition
  9. 1>        C:\Archivos de programa\Microsoft SDKs\Windows\v6.0A\include\winsock.h(124) : see previous definition of 'timercmp'
  10. 1>C:\Dev-Cpp\include\WinSock2.h(112) : error C2011: 'hostent' : 'struct' type redefinition
  11. 1>        C:\Archivos de programa\Microsoft SDKs\Windows\v6.0A\include\winsock.h(167) : see declaration of 'hostent'
  12. 1>C:\Dev-Cpp\include\WinSock2.h(120) : error C2011: 'linger' : 'struct' type redefinition
  13. 1>        C:\Archivos de programa\Microsoft SDKs\Windows\v6.0A\include\winsock.h(531) : see declaration of 'linger'
  14. 1>C:\Dev-Cpp\include\WinSock2.h(147) : error C2011: 'netent' : 'struct' type redefinition
  15. .....
  16.  


La cuestión es, como se pueden añadir dichas librerias. Por ejemplo, winsock2.h y libwsock32.a. Ambas las tenia importadas en las opciones de proyecto en dev c++, pero en vc++ en las opciones de proyecto y el resto de menus no encuentro nada de eso. Y he consultado la ayuda, pero no encuentro la forma.

¿Como se añaden dichos archivos al proyecto, en el visual c++?

En fin, a ver si fuera cosa del compilador.

Un saludo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #27 en: Viernes 7 de Diciembre de 2007, 08:13 »
0
Lo contrario en este caso, tenes winsock.h y winsock2.h, deja solo la ultima. Por supuesto en el codigo que tengo yo esta #include <winsock2.h>, en cuanto al la biblioteca de importacion yo estoy usando ws2_32.lib y la tenes que agregar en las propiedades del proyecto, algo asi como enlazador, librerias adicionales. (Yo lo compile desde linea de comandos con el VC++ 8 - VS 2005 -).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #28 en: Viernes 7 de Diciembre de 2007, 12:30 »
0
No hay manera, se resiste la compilación con el vc++.

He creado otro nuevo proyecto desde cero. Un proyecto vacío. Y he añadido al proyecto los archivos de mi código.
He sustituido los <> en los includes por "". Y en uno de los archivos de socket, había un include que ponía un path entero para incluir el winsock2.h. Lo he quitado también.

En Project, en Properties, me voy a Configuration Properties, a Linker y a General. Y ahi una de las líneas que aparece es "Additional Library Directories". Ahi puedo indicarle el directorio donde se encuentran tanto winsock2 como ws2_32.lib, pero no estoy seguro de que las esté teniendo en cuenta, porque no le estoy indicando el archivo en sí.

No hay ningún otro sitio en el que pueda añadir librerias y archivos. En el devC++, en las opciones del proyecto, había un apartado que era Parámetros, Linker, y añadir libreria u objeto.

Pero aqui nada de nada.

La lista de errores que obtengo al compilar es:

Código: Text
  1. [SIZE=1]1&#62;------ Build started: Project: ProyectoVC, Configuration: Debug Win32 ------
  2. 1&#62;Linking...
  3. 1&#62;L2cap.obj : error LNK2001: unresolved external symbol __RTC_Shutdown
  4. 1&#62;L2capChannel.obj : error LNK2001: unresolved external symbol __RTC_Shutdown
  5. 1&#62;principal.obj : error LNK2001: unresolved external symbol __RTC_Shutdown
  6. 1&#62;SOCKET.obj : error LNK2019: unresolved external symbol __RTC_Shutdown referenced in function &#34;private: static void __cdecl Socket::Start(void)&#34; (?Start@Socket@@CAXXZ)
  7. 1&#62;L2cap.obj : error LNK2001: unresolved external symbol __RTC_InitBase
  8. 1&#62;L2capChannel.obj : error LNK2019: unresolved external symbol __RTC_InitBase referenced in function &#34;public: __thiscall L2capChannel::L2capChannel(int,int,class Socket *)&#34; (??0L2capChannel@@QAE@HHPAVSocket@@@Z)
  9. 1&#62;principal.obj : error LNK2001: unresolved external symbol __RTC_InitBase
  10. 1&#62;SOCKET.obj : error LNK2001: unresolved external symbol __RTC_InitBase
  11. 1&#62;L2cap.obj : error LNK2019: unresolved external symbol __RTC_CheckEsp referenced in function &#34;unsigned int __stdcall bucleLectura(void *)&#34; (?bucleLectura@@YGIPAX@Z)
  12. 1&#62;L2capChannel.obj : error LNK2001: unresolved external symbol __RTC_CheckEsp
  13. 1&#62;principal.obj : error LNK2001: unresolved external symbol __RTC_CheckEsp
  14. 1&#62;SOCKET.obj : error LNK2001: unresolved external symbol __RTC_CheckEsp
  15. 1&#62;L2cap.obj : error LNK2019: unresolved external symbol &#34;__declspec(dllimport) public: __thiscall std::basic_string&#60;char,struct std::char_traits&#60;char&#62;,class std::allocator&#60;char&#62; &#62;::basic_string&#60;char,struct std::char_traits&#60;char&#62;,class std::allocator&#60;char&#62; &#62;(char const *)&#34; (__imp_??0?&#036;basic_string@DU?&#036;char_traits@D@std@@V?&#036;allocator@D@2@@std@@QAE@PBD@Z) referenced in function &#34;public: __thiscall L2cap::L2cap(int)&#34; (??0L2cap@@QAE@H@Z)
  16. 1&#62;L2capChannel.obj : error LNK2001: unresolved external symbol &#34;__declspec(dllimport) public: __thiscall std::basic_string&#60;char,struct std::char_traits&#60;char&#62;,class std::allocator&#60;char&#62; &#62;::basic_string&#60;char,struct std::char_traits&#60;char&#62;,class std::allocator&#60;char&#62; &#62;(char const *)&#34; (__imp_??0?&#036;basic_string@DU?&#036;char_traits@D@std@@V?&#036;allocator@D@2@@std@@QAE@PBD@Z)
  17. 1&#62;SOCKET.obj : error LNK2001: unresolved external symbol &#34;__declspec(dllimport) public: __thiscall std::basic_string&#60;char,struct std::char_traits&#60;char&#62;,class std::allocator&#60;char&#62; &#62;::basic_string&#60;char,struct std::char_traits&#60;char&#62;,class std::allocator&#60;char&#62; &#62;(char const *)&#34; (__imp_??0?&#036;basic_string@DU?&#036;char_traits@D@std@@V?&#036;allocator@D@2@@std@@QAE@PBD@Z)
  18. .........
  19.  
  20. 1&#62;ProyectoVC - 83 error(s), 0 warning(s)
  21. ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========[/SIZE]
  22.  
  23.  


Edito. Acabo de encontrar otro menu, en herramientas, opciones, projects and solutions, vc++ directories. Y ahi se pueden especificar directorios para librery files, include files, ...

He añadido en library files el directorio donde se encuentra ws_32.lib y en include files el de winsock.h

Y los errores se reducen bastante aunque sigue habiendo:

Código: Text
  1. [SIZE=1]1&#62;------ Build started: Project: ProyectoVC, Configuration: Debug Win32 ------
  2. 1&#62;Linking...
  3. 1&#62;SOCKET.obj : error LNK2019: unresolved external symbol __imp__WSAStartup@8 referenced in function &#34;private: static void __cdecl Socket::Start(void)&#34; (?Start@Socket@@CAXXZ)
  4. 1&#62;SOCKET.obj : error LNK2019: unresolved external symbol __imp__WSACleanup@0 referenced in function &#34;private: static void __cdecl Socket::End(void)&#34; (?End@Socket@@CAXXZ)
  5. 1&#62;SOCKET.obj : error LNK2019: unresolved external symbol __imp__socket@12 referenced in function &#34;protected: __thiscall Socket::Socket(void)&#34; (??0Socket@@IAE@XZ)
  6. 1&#62;SOCKET.obj : error LNK2019: unresolved external symbol __imp__closesocket@4 referenced in function &#34;public: void __thiscall Socket::Close(void)&#34; (?Close@Socket@@QAEXXZ)
  7. 1&#62;SOCKET.obj : error LNK2019: unresolved external symbol __imp__recv@16 referenced in function &#34;public: class std::basic_string&#60;char,struct std::char_traits&#60;char&#62;,class std::allocator&#60;char&#62; &#62; __thiscall Socket::ReceiveBytes(void)&#34; (?ReceiveBytes@Socket@@QAE?AV?&#036;basic_string@DU?&#036;char_traits@D@std@@V?&#036;allocator@D@2@@std@@XZ)
  8. 1&#62;SOCKET.obj : error LNK2019: unresolved external symbol __imp__ioctlsocket@12 referenced in function &#34;public: class std::basic_string&#60;char,struct std::char_traits&#60;char&#62;,class std::allocator&#60;char&#62; &#62; __thiscall Socket::ReceiveBytes(void)&#34; (?ReceiveBytes@Socket@@QAE?AV?&#036;basic_string@DU?&#036;char_traits@D@std@@V?&#036;allocator@D@2@@std@@XZ)
  9. 1&#62;SOCKET.obj : error LNK2019: unresolved external symbol __imp__send@16 referenced in function &#34;public: void __thiscall Socket::SendLine(class std::basic_string&#60;char,struct std::char_traits&#60;char&#62;,class std::allocator&#60;char&#62; &#62;)&#34; (?SendLine@Socket@@QAEXV?&#036;basic_string@DU?&#036;char_traits@D@std@@V?&#036;allocator@D@2@@std@@@Z)
  10. 1&#62;SOCKET.obj : error LNK2019: unresolved external symbol __imp__WSAGetLastError@0 referenced in function &#34;public: void __thiscall Socket::SendBytes(class std::basic_string&#60;char,struct std::char_traits&#60;char&#62;,class std::allocator&#60;char&#62; &#62; const &)&#34; (?SendBytes@Socket@@QAEXABV?&#036;basic_string@DU?&#036;char_traits@D@std@@V?&#036;allocator@D@2@@std@@@Z)
  11. 1&#62;SOCKET.obj : error LNK2019: unresolved external symbol __imp__listen@8 referenced in function &#34;public: __thiscall SocketServer::SocketServer(int,int,enum TypeSocket)&#34; (??0SocketServer@@QAE@HHW4TypeSocket@@@Z)
  12. 1&#62;SOCKET.obj : error LNK2019: unresolved external symbol __imp__bind@12 referenced in function &#34;public: __thiscall SocketServer::SocketServer(int,int,enum TypeSocket)&#34; (??0SocketServer@@QAE@HHW4TypeSocket@@@Z)
  13. 1&#62;SOCKET.obj : error LNK2019: unresolved external symbol __imp__htons@4 referenced in function &#34;public: __thiscall SocketServer::SocketServer(int,int,enum TypeSocket)&#34; (??0SocketServer@@QAE@HHW4TypeSocket@@@Z)
  14. 1&#62;SOCKET.obj : error LNK2019: unresolved external symbol __imp__accept@12 referenced in function &#34;public: class Socket * __thiscall SocketServer::Accept(void)&#34; (?Accept@SocketServer@@QAEPAVSocket@@XZ)
  15. 1&#62;SOCKET.obj : error LNK2019: unresolved external symbol __imp__connect@12 referenced in function &#34;public: __thiscall SocketClient::SocketClient(class std::basic_string&#60;char,struct std::char_traits&#60;char&#62;,class std::allocator&#60;char&#62; &#62; const &,int)&#34; (??0SocketClient@@QAE@ABV?&#036;basic_string@DU?&#036;char_traits@D@std@@V?&#036;allocator@D@2@@std@@H@Z)
  16. 1&#62;SOCKET.obj : error LNK2019: unresolved external symbol __imp__gethostbyname@4 referenced in function &#34;public: __thiscall SocketClient::SocketClient(class std::basic_string&#60;char,struct std::char_traits&#60;char&#62;,class std::allocator&#60;char&#62; &#62; const &,int)&#34; (??0SocketClient@@QAE@ABV?&#036;basic_string@DU?&#036;char_traits@D@std@@V?&#036;allocator@D@2@@std@@H@Z)
  17. 1&#62;SOCKET.obj : error LNK2019: unresolved external symbol __imp__select@20 referenced in function &#34;public: __thiscall SocketSelect::SocketSelect(class Socket const * const,class Socket const * const,enum TypeSocket)&#34; (??0SocketSelect@@QAE@QBVSocket@@0W4TypeSocket@@@Z)
  18. 1&#62;SOCKET.obj : error LNK2019: unresolved external symbol ___WSAFDIsSet@8 referenced in function &#34;public: bool __thiscall SocketSelect::Readable(class Socket const * const)&#34; (?Readable@SocketSelect@@QAE_NQBVSocket@@@Z)
  19. 1&#62;C:&#092;Documents and Settings&#092;Dani&#092;Mis documentos&#092;Visual Studio 2008&#092;Projects&#092;ProyectoVC&#092;Debug&#092;ProyectoVC.exe : fatal error LNK1120: 16 unresolved externals
  20. 1&#62;Build log was saved at &#34;file://c:&#092;Documents and Settings&#092;Dani&#092;Mis documentos&#092;Visual Studio 2008&#092;Projects&#092;ProyectoVC&#092;ProyectoVC&#092;Debug&#092;BuildLog.htm&#34;
  21. 1&#62;ProyectoVC - 17 error(s), 0 warning(s)
  22. ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========[/SIZE]
  23.  
  24.  

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #29 en: Viernes 7 de Diciembre de 2007, 13:08 »
0
Tenes que usar winsock2.h:
#include <winsock2.h> en lugar del path del Dev-Cpp.

Para que enlace tenes que ir al proyecto, click derecho en Propertiesy:

Configuration Properties>>Linker>>Input>>Additional Dependencies y agregar ws2_32.lib nada mas.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #30 en: Viernes 7 de Diciembre de 2007, 13:25 »
0
Compilación lograda.

Pero el resultado es el mismo. Se devuelve un -1 en getError.

E incluso diria que el resultado es peor que con dev C++, ya que cuando intento hacer una ejecución eligiendo SendRaw en el principal, también devuelve un -1. No se transmite por el socket en ninguno de los dos casos. Mientras que en devC++ sí se transmitia en éste último caso.

Edito: el error en concreto es el mismo que anteriormente, el 10038.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #31 en: Viernes 7 de Diciembre de 2007, 13:30 »
0
-1 no es nada mas que un error generico, fijate cual es el error concreto (WSAGetLastError).

Si es el mismo error que antes:
Depura (o usa alguna cadena para mostrar en pantalla) los puntos donde es crean, se cierran y se usan los sockets. Es la unica forma de comprender el problema realmente.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #32 en: Lunes 10 de Diciembre de 2007, 22:18 »
0
Creo que he encontrado el error.

En la función Wrapper_a_EscribeEnSocket, estaba llamando a Escribe en Socket, que realizaba un SendBytes, pero en realidad no estaba realizado correctamente.

El código de dicha función, a la que llamaba el canal mediante la callback, era:

Código: Text
  1. void L2cap::Wrapper_a_escribeEnSocket (void* pt2Object, std::string cadena)
  2. {
  3.     cout&#60;&#60;&#34;Welcome to WRAPPER&#34;&#60;&#60;endl;
  4.       L2cap* mySelf = (L2cap*) pt2Object;
  5.       mySelf-&#62;escribeEnSocket(cadena);
  6. }
  7.  

Lo que ocurre es que mySelf no es mi capa L2CAP. mySelf es un objeto L2CAP, y por tanto tiene los mismos métodos y por eso no da error de compilación. Pero en realidad, ni he definido el comportamiento de dicha clase L2CAP que he creado (debería decirle si es Server o Client, en su constructor), ni es lo que esperaba realizar.

Yo lo que debería es hacer referencia a mi misma clase L2CAP ya creada. Esto me imagino que será usando el puntero this, aunque no tengo ni idea de como hacerlo. ¿Como sería? La idea del código está todo correcto, salvo el tema de que no estoy llamando a EscribeEnSocket de mi clase ya creada (y por tanto, el socket definido ya conocido), sino que estaba llamando a una clase L2CAP, y estaría usando otro socket seguramente.


El canal, se creaba de la siguiente manera:

Código: Text
  1. int L2cap::Openchannel_req ()
  2. {
  3. ...
  4.  
  5.     canales.push_back(new L2capChannel(CID,PSM,(void*)this,&Wrapper_a_escribeEnSocket)); // Callback
  6.    
  7.  
  8. ....
  9.  
  10. }
  11.  



Y el canal, llamaba al wrapper desde el constructor del canal:

Código: Text
  1. L2capChannel::L2capChannel (int CID, int PSM,void* a, void(*pt2Func)(void*, std::string))
  2. {
  3.    _estado = CLOSED;
  4.    _localCID = CID;
  5.    _PSM = PSM;
  6.    _ME = a;
  7.    cout&#60;&#60;&#34;Se supone que enviamos!&#34;&#60;&#60;endl;  
  8.    pt2Func (_ME,&#34;080001000205040001004000&#34;); // Llama al Wrapper
  9. }
  10.  

A ver si me pudieseis ayudar con esto, ya por lo menos está localizado el error. Esta mas cerca de solucionarse :)

Muchísimas gracias por todo!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #33 en: Lunes 10 de Diciembre de 2007, 22:45 »
0
No se realmente donde encontraste el error. Yo lo depuro y esta correcto:

En main tenes un objeto llamado micapa de la clase L2cap cuya direccion en memoria es en mi caso 0x0012feec. Sigo la pila y llegamos a Openchannel_req donde se crea un objeto de tipo L2capChannel. En el constructor del mismo se recibe como tercer parametro un void * a cuyo valor en este caso tambien es 0x0012feec. Ese constructor llama a Wrapper_a_escribeEnSocket con un parametro void *pt2Object con el mismo valor de siempre, ahi mismo tenes un puntero a un objeto de la clase L2cap mediante un casting a la direccion de siempre. Con lo cual mySelf es lo mismo que &micapa del main. Eso llama a escribeEnSocket donde this ya es igual a &micapa/mySelf y SendBytes lo mismo. Por eso mismo me funciona perfectamente.

mySelf es un puntero a micapa y no necesitas cambiar ni asignar ningun valor en el, el socket es el mismo.

Depura (o usa alguna cadena para mostrar en pantalla) los puntos donde se crean, se cierran y se usan los sockets. Es la unica forma de comprender el problema realmente.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #34 en: Lunes 10 de Diciembre de 2007, 23:28 »
0
Es cierto. No se por que vi que ahí podría haber un error :(

Voy a ejecutar sacando información por pantalla de dichos momentos.

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #35 en: Lunes 10 de Diciembre de 2007, 23:48 »
0
He puesto salidas por pantallas en los momentos que se crean los sockets, en el constructor de L2CAP.

Cuando hago un socketServer, da un numero hexadecimal.
Cuando hago SocketClient, s toma otro valor hexadecimal.

Y saco por pantalla también el contenido de s en escribeEnSocket, y dicho valor es el mismo que el que cuando hacía SocketClient, lo cual es correcto. Ese lugar es el único en el que se realiza un envío por el socket.(SendBytes).



Si saco por pantalla el valor de s en el bucle de leer socket, en ambos casos se imprime su valor correspondiente (en cliente el del cliente, y en servidor el del servidor).

¿todo esta correcto no?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #36 en: Lunes 10 de Diciembre de 2007, 23:52 »
0
Es probable, a mi me funciona, pero no se si comprobaste los puntos donde esos sockets se cierran. Si te dice que el socket no es valido es por una razon ... o es un numero totalmente al azar o ese socket fue cerrado con anterioridad.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #37 en: Martes 11 de Diciembre de 2007, 00:25 »
0
Bueno, ese es el contenido de la variable s, en el programa.

Si lo que saco por pantalla es, en socket.cpp, el valor de s_ (que es el socket, ¿no?), los valores obtenidos son diferentes.

Código: Text
  1. void Socket::SendBytes(const std::string& s)
  2. {
  3. send(s_,s.c_str(),s.length(),0);
  4. }
  5.  


Saca por pantalla que el valor de s_ es 64. (y 64, si lo pasamos a hexadecimal, es 40).

Si yo cojo, y en SendBytes modifico el valor de s_ al principio antes de hacer send, y le pongo el valor que debería de tener (es decir, el que mostraba por pantalla cuando era cliente), al ejecutar las cosas no son como deberían.

Le digo que: s_ = 0x22fe60; justo antes de hacer send.

Y lo mostrado por pantalla es, que el valor de s_ es igual a 2293344 ( que es 22fe60 en decimal) por lo tanto está correcto esto. Aunque al Servidor sicge sin llegarle nada.

Si le digo que el valor de s_ sea   s_ = 0x3d27e0; (que es el valor cuando es Servidor) tampoco ocurre nada.


Lo que es un poco mosqueante, es que, en la Tabla de registro de canales L2CAP, que se imprime en la ventana del Cliente, imprime los valores de los campos CID y PSM de la posición 0 del vector. Y dichos valores son los correctos (concretamente el CID es 40, lo cual es correcto puesto que es el primer valor que debe asignar).

Sin embargo, cuando he hecho los cambios de asignarle a s_ un nuevo valor distinto del que tenía para ver si envíaba algo, pue spor pantalla salía el valor modificado de s_, pero también se modificaba el valor de CID de la tabla!

Y no se por que porque aparentemente no tienen ninguna relación. Ambas están en partes distintas del código.  s_ se supone que es el socket, y CID es una variable que se supone que se asigna, independientemente de eso.

¿He encontrado algo útil?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #38 en: Martes 11 de Diciembre de 2007, 00:30 »
0
Si estas probando algo con el servidor por ahora olvidalo por completo, ejecutalo y no lo pruebes/depures, no tiene sentido. No se si encontraste algo ya que no se realmente que fue lo que hiciste. ¿Ya comprobaste los puntos donde se cierra el socket? No quiero repetir lo mismo 500 veces.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #39 en: Martes 11 de Diciembre de 2007, 00:43 »
0
Eternal Idol, siento de verdad mi torpeza en este problema. He intentado sacar toda la información que he podido obtener por pantalla.

No se con certeza el punto donde se cierran los sockets. La creación imagino que la he identificado correctamente, cuando definimos el socket en SocketClient y SocketServer. Pero el cierre, ... he buscado en la clase socket "close", y hay un closesocket(s_). He puesto que sacase una linea por pantalla informando del valor de s_ en el caso de que lo fuese a cerrar, pero no se ha imprimido por pantalla ningún valor, por lo tanto el socket no se ha cerrado.

Pido disculpas por no haber comprobado esto antes.

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #40 en: Martes 11 de Diciembre de 2007, 00:46 »
0
Lo que hice antes fue, en el código de SendBytes en Socket.cpp, cambié el valor de s_ a un valor que le dí yo. Por pantalla mostraba dicho cambio, pero el cambio también afectaba al contenido del campo CID almacenado en la posición 0 del vector de la tabla de canales.

Eso es lo que explicaba en el post anterior.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #41 en: Martes 11 de Diciembre de 2007, 00:47 »
0
Bien, no se cierra. Se crea con la funcion socket(), buscala y comproba que su valor de retorno (se supone que se crea uno solo) sea exactamente el mismo que pasas a send() siempre (s_).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #42 en: Martes 11 de Diciembre de 2007, 00:59 »
0
En la búsqueda de "close" no había encontrado otros sitios donde se cerraba también el socket, al no ponerle que la búsqueda la realizara en totalidad del fichero, y no desde el cursor.

He puesto mensajes en todos los close, y he obtenido que en servidor, se crea el socket con s = 3d27e0 [s es la variable de l2cap], saca el mensaje de conexión recibida, t a continuación se produce un cierre de socket. Y el valor de s_ es DC (en hexa, que en decimal es 220).

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #43 en: Martes 11 de Diciembre de 2007, 01:13 »
0
He puesto a sacar por pantalla también el valor de s_ en Socket(), y comprobado con el valor de s_ en Send(), y no son iguales.

En el cliente, lo primero que se realiza es Socket(), y el valor devuelto es D4.
A continuación, en cuanto saca por pantalla el mensaje de Conexión Recibida, saca un mensaje por pantalla de que se ha cerrado el socket, y el valor de s_ es DC.

Y luego se queda ahi, esperando nuevos datos, ...


En el cliente pos su parte, al principio lo que se hace también primero es Socket(), y el valor de s_ es D4. Y en el Send() el valor de s_ es 64. Y entonces a continuación saca por pantalla la información de error (-1) y el codigo (10038).

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #44 en: Martes 11 de Diciembre de 2007, 09:23 »
0
Siempre hace las comprobaciones en el ambito de cada proceso (cliente y servidor) no sirve de nada comparar entre ambos ya que al ser otro proceso su tabla de handles es completamente independiente.

En el cliente si socket() y send() usan un diferente s_ es logico que falle, comproba todos los puntos donde se podria cambiar este valor. Lo mejor es que lo depures, desde el momento en que s_ es asignado por socket() - donde tiene que ser valido - hasta el momento en que cambia. En el servidor se usa un socket para escuchar y despues hay otro para conexion aceptada y con ese se comunica.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #45 en: Martes 11 de Diciembre de 2007, 15:16 »
0
Esta noche cuando regrese me pondré a intentar localizar el punto donde se cambia el valor de s_ en el Cliente.

De todas formas, se produce un cierre de socket en el servidor, tras mostrar la aceptación de la conexión (Conexión recibida). No se tendría por qué producir un cierre de socket, ¿no?


Para aislar el que esté teniendo problemas en el servidor o en el cliente, puedo probar a crear un programa a parte, que no tenga nada que ver con mi código, y que lo que haga sea por ejemplo escuchar por el mismo puerto 3000, y sacar por pantalla lo que reciba.

Y otro que lo que haga sea escribir algo por ese puerto, y así testearía el comportamiento del servidor l2cap. ¿no?

Debería funcionar y haber comunicación. Tan solo declarar SocketClient, y hacer un SendBytes, o declarar SocketServer, hacer un accept y un receivebytes.

Un saludo y en cuanto tenga resultados los comento. Muchísimas gracias de nuevo.

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #46 en: Martes 11 de Diciembre de 2007, 23:29 »
0
Me dispongo a depurar el modo Servidor.

Elijo la opción servidor.
Se realizan una serie de acciones en allocator.h new_allocator.h y stl_vector.h, realizando reservas de memoria para el vector.

Después de esto, llegamos al constructor de L2CAP, y realiza las acciones de acuerdo con el modo elegido (servidor). Se realiza un SocketServer, al puerto 3000. sockaddr_in
Pasamos a Socket(), en la clase Socket.

Se llama a Start(). nofSockets y WSAStartup dice que no las encuentra en este contexto, con lo cual parece que no hace nada, y solo incrementa nofSockets, que indica lo mismo, que no la encuentra en el contexto. (Con lo cual aqui no se hace nada).


Seguimos en Socket(), y this->s_ (que es s_ en la clase socket) pasa a tomar el valor 1828.
refCounter_ vale 0x3d24d8. Salimos de Socket(), y seguimos en SocketServer, en memset.

sa.sin_family = 2
sa.sin_port = 47115

s_ = 1828


No detecta que sea un socket inválido, y tampoco entra en los bucles de que sea un NonBlockingSocket ni que se cumpla la condición de bind.... Seguimos por listen (s_,connections). [connections vale 5].

De ahi pasamos a Socket* sa=in.Accept(), que provoca irnos a Accept en Socket, y se queda ahi parado, esperando, en new_sock = accept (s_,0,0).

Paso ahora a ejecutar mi otro programa y a elegir modo cliente.

En ese momento, se produce un salto, y nos encontramos en la función Accept en SocketServer. Se llama a Start(). refcounter vale ahora 0xbaadf00d. Se devuelve el valor de r desde Accept en SocketServer, que es 0x3d2908.

Volvemos al constructor de L2CAP, y copiamos el valor de sa a s. Dicho valor es 0x22ff20. Imprime por pantalla el mensaje Conexion Recibida. Se coloca sobre _beginthreadex, y al darle a siguiente paso hace de nuevo SocketServer in (3000,5) ahi en el constructor de L2CAP. Se salta al destructor del socket. Se llama a Close, y éste hace closesocket(s_), y s_ vale 1828.

Se hace un delete refCounter en el destructor de Socket. El valor de refCounter es 0x3d24d8.

Volvemos a SocketServer in en el constructor de L2CAP, y se hace un salto al final del constructor y se sale de el. Quedando ya para siempre en el bucle del programa principal de mostrar por pantalla: "Sigo aqui en modo Servidor".



Desde luego que las acciones que hace ahi en el constructor de L2CAP no tienen ningún sentido, al menos no se lo veo. No se porque se destruye el socket, ni porqué se pasa a hacer de nuevo SocketServer. :(

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #47 en: Martes 11 de Diciembre de 2007, 23:56 »
0
Tanto sentido como _escuchando = true; en la primera linea del constructor de L2cap pero es TU codigo. Todo ese constructor es erroneo ...

No se donde habras sacada esto:
Código: Text
  1.  
  2.   *(s) = sb; //Con esto hemos anclado el contenido del puntero y ya no se borra al salir del Constructor
  3.  

En cuanto termina ese constructor se llama al destructor de in o sb segun corresponda ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #48 en: Miércoles 12 de Diciembre de 2007, 00:27 »
0
Esa línea la coloqué porque no sabía si el socket estaba siendo destruido en cuanto salía del constructor (cosa que efectivamente estaba pasando). Intenté remediarlo con esto, pero no vale para nada.

En cuanto al valor de la variable global escuchando la tengo inicializada ahí porque es una variable que necesito que desde la creación de mi nuevo objeto esté a true, para efectuar la lectura, y en el caso de que por el socket alguna vez reciba la cadena "exit", esa variable se pondrá a false, y se saldrá del bucle en el que se lee el socket contínuamente.


Lo que no entiendo es como el programa provoca unos resultados exitosos en tu ordenador, pero yo no logro hacerlo, y el comportamiento es totalmente erroneo. :(

Voy a intentar hacer dos constructores distintos, uno para el cliente y otro para el servidor. En lugar de hacer en el mismo constructor la distinción de si se le está pasando un 1 o un 2 para definir el comportamiento, aunque esto no deberñia de ser un problema, es un simple if, de una variable que se le pasa al constructor, ¿no?

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Comunicación Por Sockets
« Respuesta #49 en: Miércoles 12 de Diciembre de 2007, 00:55 »
0
Al eliminar la línea siguiente

*(s) = sb; //Con esto hemos anclado el contenido del puntero y ya no se borra al salir del Constructor

 el error devuelto por getlasterror cambia, y ya no es 10038, sino 10093. He encontrado lo siguiente acerca de este error:

10093 WSANOTINITIALISED

"Successful WSAStartup not yet performed. Either the application has not called WSAStartup or WSAStartup failed. The application may be accessing a socket that the current active task does not own (that is, trying to share a socket between tasks), or WSACleanup has been called too many times."