none
Cambiar el tiempo de conexión y reintentos tcp para una aplicación RRS feed

  • Pregunta

  • Hola, 

    Mi intención es cambiar de manera local a una aplicación y sus dll el tiempo de conexión tcp y el número de reintentos. Modificar las claves del registro que controlan estos valores no me parece una buena idea, a menos que haya algún método de hacerlo de manera local a la aplicación y temporal. ¿Hay alguna otra alternativa para cambiar el timeout que tarda cualquier llamada a connect o derivada (ConnectEx) en las librerías? 

    Un saludo,

    Jordi Ortola 

    viernes, 25 de enero de 2013 11:09

Respuestas

  • Por lo que  he visto leido esto sólo se puede hacer con el detours. Los registros que controlaban estos parámetros encargados de modificar el tiempo de conexión TCP con el handshake ya no son efectivos desde Windows Vista, ya que se han integrado en el kernel de manera dinámica para protección syn flood y demás. 

    Para los que tengan este problema con libvlc --ipv4-timeout=N (ms).

    Un saludo. 

    • Marcado como respuesta marranxo viernes, 25 de enero de 2013 16:34
    viernes, 25 de enero de 2013 16:34

Todas las respuestas

  • Yo diría que no hay forma de alterar ese tiempo para una única aplicación.  ¿Por qué quiere hacer esto, exactamente?

    Jose R. MCP
    Code Samples

    viernes, 25 de enero de 2013 14:40
    Moderador
  • Uso las librerías de vlc para trabajar con streams de vídeo remotos y tengo el problema que cuando el dispositivo que sirve el stream está caído tarda unos 24s por stream en reaccionar. Este tiempo es el lapso de un connect. No tengo posibilidad de cambiar los valores con setsockopt (a no ser que editase el código fuente de libvlc), sin embargo entendí que una manera aceptable de solucionar este escollo sería cambiar los valores predeterminados de estas funciones que están almacenados en el registro de windows, aunque no querría ni hacerlo permanente ni alterar el funcionamiento de las otras apps. Ese es el motivo por el que quería ver si o bien winsock1/2 me podría proveer de alguna llamada para realizar esto (que no la he visto) o bien la API del registro que sí he visto algo que pudiera similar pero no entiendo ni sé si finalmente me fuese a ser de utilidad: RegOverridePredefKey. 

    Gracias por tu tiempo.

     
    viernes, 25 de enero de 2013 14:50
  • Pues yo imagino que el cambio en el registro de Windows requiere de privilegios de administrador, así que su aplicación requeriría de elevación que en mi opinión hace que la posiblidad de hacer esto sea nula porque no tiene sentido molestar al usuario con privilegios de administrador simplemente para ver vídeos.

    Lo mejor que usted podría hacer es crear la conexión en un hilo aparte.  Si la conexión no se da en un tiempo prudencial (puede usar un timer en el hilo principal) entonces aborta el hilo secundario y procede con el siguiente stream.

    Específicamente:  Llamar a connect() o ConnectEx() desde un hilo secundario con sockets que no bloqueen.  Eso devuelve un OVERLAPPED, si no me equivoco, con un objeto de sincronización.  Además de ese objeto, cree otro objeto de sincronización para indicarle al hilo cuándo abortar, y en el hilo secundario use WaitForMultipleObjects() para esperar por estos dos objetos.  Si el hilo despierta porque el hilo maestro dijo que había que abortar, simplemente procede usted a abortar la conexión y cerrar el hilo, pero si el hilo despierta porque la operación de conexión ya terminó entonces procede de forma habitual.


    Jose R. MCP
    Code Samples

    viernes, 25 de enero de 2013 14:56
    Moderador
  • No es una app de ver vídeos, es una especie de videograbador de cámaras IP. Lo que usted me está planteado es lo que suelo hacer, trabajar con sockets no bloqueantes.. Pero en este caso no me es posible sin meterme en código ajeno, por eso pensé en ver si podría realizar algún hook en el modo que winsock adquiere dicha información como realizar una "redirección" y que en vez de leer de la clave que tiene asignada en su ruta leyese otra mediante RegOverridePredefKey:

    Remarks

    The RegOverridePredefKey function is intended for software installation programs. It allows them to remap a predefined key, load a DLL component that will be installed on the system, call an entry point in the DLL, and examine the changes to the registry that the component attempted to make. The installation program can then write those changes to the locations intended by the DLL, or make changes to the data before writing it.

    For example, consider an installation program that installs an ActiveX control as part of an application installation. The installation program needs to call the control's DllRegisterServer entry point to enable the control to register itself. Before this call, the installation program can call RegOverridePredefKey to remap HKEY_CLASSES_ROOT to a temporary key such as HKEY_CURRENT_USER\TemporaryInstall\DllRegistration. It then calls DllRegisterServer, which causes the ActiveX control to write its registry entries to the temporary key. The installation program then callsRegOverridePredefKey again to restore the original mapping of HKEY_CLASSES_ROOT. The installation program can modify the keys written to the temporary key, if necessary, before copying them to the original HKEY_CLASSES_ROOT.

    After the call to RegOverridePredefKey, you can safely call RegCloseKey to close the hNewHKey handle. The system maintains its own reference to hNewHKey.

    Lo que no sé es si al "redirigir" una clave predefinida a otra temporal, las llamadas a  RegGetValue se realizarán sobre la llave por defecto o sobre la temporal. 

    Lo de los privilegios es normal, de hecho ya adquiero privilegios para que se pueda apagar y reiniciar el equipo. 


    • Editado marranxo viernes, 25 de enero de 2013 15:18
    viernes, 25 de enero de 2013 15:12
  • Pues no tengo experiencia con RegOverridePredefKey() así que no creo poder contestarle en ese sentido.

    Hasta donde sé, para poder hacer algo como eso pero para funciones de Windows, existe Microsoft Detours, pero hasta donde sé no es gratuito.


    Jose R. MCP
    Code Samples

    viernes, 25 de enero de 2013 15:18
    Moderador
  • No sé qué es eso exactamente, pero parece un hook a la syscall table del kernel, me equivoco? 
    viernes, 25 de enero de 2013 15:23
  • Algo así, sí.  Con eso usted puede reemplazar la llamada a connect() y hacer como guste.

    Jose R. MCP
    Code Samples

    viernes, 25 de enero de 2013 15:34
    Moderador
  • Por lo que  he visto leido esto sólo se puede hacer con el detours. Los registros que controlaban estos parámetros encargados de modificar el tiempo de conexión TCP con el handshake ya no son efectivos desde Windows Vista, ya que se han integrado en el kernel de manera dinámica para protección syn flood y demás. 

    Para los que tengan este problema con libvlc --ipv4-timeout=N (ms).

    Un saludo. 

    • Marcado como respuesta marranxo viernes, 25 de enero de 2013 16:34
    viernes, 25 de enero de 2013 16:34