Page 1 of 1

Problemas Socket y Windows CE 4.2

Posted: Tue Mar 14, 2006 7:30 pm
by jmartial
Hola,

Intentado juguetear con los sockets he descubierto que dan un internal error en Windows CE, sin embargo en Windows Mobile parece que va bien, incluyendo el emulador.

Las pruebas las estoy haciendo con una casio cassiopea IT-600

Esto falla: o := TSocket():New( , oWnd )

Esto también: nSocket := Socket( AF_IRDA, SOCK_STREAM, 0 )
devuelve -1 en vez de un nº de socket y no es un valor válido.

Es muy importante, pues inmediatamente, perdemos compatibilidad con las máquinas industriales bajo win CE.


Un Saludo,
Joaquín

Posted: Tue Mar 14, 2006 7:57 pm
by Antonio Linares
Joaquín,

Con los builds más recientes de FWPPC se indica la descripción del error interno. ¿ Que descripción te sale ?

Posted: Tue Mar 14, 2006 8:18 pm
by jmartial
El mensage es un msgbox que casi no da tiempo de leerlo, pues desaparece sólo, como título pone "hb_internal()" y como texto "internal error".

Construído con el último build, no existe más descripción del error por ningún lado, ni siquiera como error.txt en la carpeta donde lo ejecuto.



Un Saludo,
Joaquín

Posted: Thu Mar 16, 2006 8:19 pm
by jmartial
Antonio,

Sigo con las pruebas, a ver si averiguamos de donde viene el problema.
El siguiente ejemplo:

WSAStartup()
msginfo( "Pru socket1 "+str(socket(AF_IRDA, SOCK_STREAM, 0)) )
msginfo( "Pru socket2 "+str(prusock()) )
WSACleanUp()

//--------- Función en C para prusock() ---------------
HB_FUNC( PRUSOCK )
{
hb_retni( socket(AF_IRDA, SOCK_STREAM, 0) );
}

En windows Mobile la 1 da Ok la 2 da Error.

En windows CE 5.0 la 1 da Error la 2 da Ok


Explicación? No encuentro ninguna. A ver si Antonio ve alguna diferencia entre la implementación que tiene de la función socket fwppc, de la que muestro yo de pruebas.

Un Saludo,
Joaquín

Posted: Thu Mar 16, 2006 8:30 pm
by jmartial
Se me olvidaba decir, por si pudiera tener algo que ver, que estos son los ficheros que incluyo en la cabecera del C

#pragma BEGINDUMP

#include <windows.h>
#include <hbapi.h>
#include "winsock2.h"
#define _WIN32_WCE
#include <af_irda.h>


Un Saludo,
Joaquín

Posted: Thu Mar 16, 2006 9:04 pm
by Antonio Linares
Joaquín,

la implementación de sockets de FWPPC está en source\winapi\winsock.c

y la llamada a la función socket() se hace desde la Clase TSocket así:

Socket( AF_INET, SOCK_STREAM, IPPROTO_IP )

Tu usas AF_IRDA en vez de AF_INET. AF_IRDA es el infrarojos, no ? quizá sea esa la diferencia.

Posted: Thu Mar 16, 2006 9:36 pm
by jmartial
Antonio,

No van por ahí los tiros, te explico:

Esto directamente falla en Win CE

TSocket():New( , oWnd ) // provoca hb_internal error

y otro tema es que me parece que ya he visto la diferencia:

En el código C hay que definir lo siguiente:

// Para Windows Mobile
#define _WIN32_WCE

// Para Windows CE 5.0
#define _WIN32_WINDOWS


El problema es que no soy muy ducho con el C y no sé poner al principio, lo siguiente ( son simulados los comandos de C )


#pragma BEGINDUMP

#include <windows.h>
#include <hbapi.h>

//---------- Habría alguna manera de poner este trocito en C
if IsMobile
#define _WIN32_WCE
else
#define _WIN32_WINDOWS
//-------------------------------------------------------------------

#Include ....




Un Saludo,
Joaquín


#include <af_irda.h>

Posted: Thu Mar 16, 2006 9:49 pm
by Antonio Linares
Joaquín,

Estás usando el build más reciente de FWPPC y no te sale la descripción del error interno ?

Posted: Thu Mar 16, 2006 10:04 pm
by jmartial
Antonio,

Acabo de instalar el de hoy y ahora no sale ni internal error, poniendo esto:

msginfo("Antes")

o := TSocket():New( ,oWnd)

msginfo("después")

......


La palabra "después" nunca llega a mostrarse y el sistema se queda como herido (aunque no de muerte) porque puedes pulsar otro botón y salir.

Con el build de hace un par de días sólo mostraba hb_internal error


Un Saludo,
Joaquín

Posted: Thu Mar 16, 2006 10:24 pm
by Antonio Linares
Joaquín,

Acabamos de probar este ejemplo con el build de FWPPC más reciente, en el emulador, y ha funcionado correctamente:

Code: Select all

#include "FWCE.ch"

function Main()

   local oWnd, o

   DEFINE WINDOW oWnd

   msginfo("Antes") 

   o := TSocket():New( ,oWnd ) 

   msginfo("después")
   
   ACTIVATE WINDOW oWnd

return nil