FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Problema con estructuras de datos y sockets
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Problema con estructuras de datos y sockets
Posted: Tue May 22, 2007 01:43 PM
Tengo esta estructura de datos

#define WSADESCRIPTION_LEN 256+1
#define WSASYS_STATUS_LEN  128+1

C STRUCTURE _WSAData ALIGN 4
  MEMBER wVersion                      IS CTYPE_SHORT
  MEMBER wHighVer                      IS CTYPE_SHORT
  MEMBER szDescrip[WSADESCRIPTION_LEN] IS CTYPE_CHAR
  MEMBER szSystem[WSASYS_STATUS_LEN]   IS CTYPE_CHAR
  MEMBER iMaxSock                      IS CTYPE_SHORT
  MEMBER iMaxUdpDg                     IS CTYPE_SHORT
  MEMBER lpVendor                      IS CTYPE_LONG
END C STRUCTURE

WSAData:=(struct _WSAData)


Ademas wrapeada la funcion del API de windows, de esta forma

DLL32 FUNCTION WSAStartup(n AS LONG, pStruct AS LPSTR) AS LONG PASCAL FROM "WSAStartup" LIB "wsock32.dll"


Se llama a dicha funcion pasandole el "buffer" de la estructura

cTemp:=WSAData:InternalBuffer
rc:=WSAStartup(bin2i(chr(1)+chr(1)),@cTemp)


Pero NO se como devolver el contenido del buffer de nuevo a la estructura.
La data :InternalBuffer solo es de lectura...

驴 Como se hace ?
Mi abuelo dec铆a: Los aviones vuelan porque Dios quiere, y los helic贸pteros ni Dios sabe porque vuelan.

FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Problema con estructuras de datos y sockets
Posted: Thu May 24, 2007 07:24 AM

Pues sigo parado sin saber como devolver el buffer a la esctructura... :cry: :cry: :cry:

Mi abuelo dec铆a: Los aviones vuelan porque Dios quiere, y los helic贸pteros ni Dios sabe porque vuelan.

FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Problema con estructuras de datos y sockets
Posted: Thu May 24, 2007 07:36 AM
Los objetos estan basados en arrays por lo que puedes "saltarte" el control del motor de classes y acceder a los datos directamente, s贸lo has de saber donde est谩 la posici贸n del dato:
for n = 1 to Len( WSAData )
   if WSAData[ n ] == WSAData:InternalBuffer
      WSAData[ n ] := ... // as铆gnale el nuevo valor
   endif
next

Por otra parte revisa las funciones contenidas en FWH source/winapi/winsock.c ya que est谩n ya implementadas muchas de las funciones que vayas a usar
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Problema con estructuras de datos y sockets
Posted: Thu May 24, 2007 02:45 PM
Ya pero Len(WSAData) no me da el numero de elementos de la estructura, me da la longitud del string que tiene el InternalBuffer (el SizeOf), 398 en el caso que nos ocupa (cada SHORT 2 bytes, LONG 4 bytes...)

Entonces en la classe "C STRUCTURE" de harbour tiene que haber la forma de asignar la variable cTemp de nuevo al buffer.

En 16 bits lo hago asi:
cTemp:=WSAData:Buffer 
rc:=WSAStartup(bin2i(chr(1)+chr(1)),@cTemp)
WSAData:Buffer:=cTemp

Ya que la data BUFFER es asignable (3陋 l铆nea), en 32 bits la data InternalBuffer es solo de lectura.

Por lo que la solucion que me das no me puede solucionar el tema de la asignacion del buffer devuelto por la funcion....

Y eso que esta de "WSAStartup" es la primera de las muchas que uso para el tema de las comunicaciones multicast, en cuanto comienze a complicarse la cosa con estructuras dentro de estructuras no puedo andas con arrays de datos las tengo que manejar puras.

Me quedan todavia WSACleanup, MemCopy, socket, setsockopt, getsockopt, htonl, htons, bind, inet_addr, WSAAsyncSelect, recv, recvfrom, send, sendto, etc...

Supongo que si pudiera disponer de la clase de harbour que maneja las estructuras podriamos sacar algo....

Existe un documento "cstruct.txt" en la distribucion de harbour 0.99.70 pero mi ingles no pasa de unos pocos vocablos.
Indica que la clase tiene estas datas: acTypes, SizeOf, nId, InternalBuffer
Y estos m茅todos: Buffer([New],[lAdopt]), Value, DeValue([lAdopt]), Array, SayMembers(cPad), Init(aValues), Pointer([nNew],[lAdopt])

Respecto al metodo Buffer([New],[lAdopt]) dice asi:
Optionally SET the InternalBuffer to a new image, which will automatically
call the DeValue() Method to reflect the change in Member Properties. The
lAdopt flag indicates memory pointed by nested pointers should be assigned
to the resulting members, or should remain the responsability of caller.


驴 Alguna idea ?
Mi abuelo dec铆a: Los aviones vuelan porque Dios quiere, y los helic贸pteros ni Dios sabe porque vuelan.

FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Problema con estructuras de datos y sockets
Posted: Thu May 24, 2007 04:11 PM

Es una clase propia de xHarbour y lo id贸neo ser铆a que preguntases en el foro de soporte de xharbour, ya que no es algo que hallamos implementado en FiveTech

De todas formas vamos a revisarlo para ver si podemos ayudarte

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Problema con estructuras de datos y sockets
Posted: Thu May 24, 2007 04:20 PM

Prueba a llamar a:

WSAData:Buffer( cNuevoBuffer )

WSAData:Buffer( cNuevoBuffer, .T. )

pero lo dicho, lo id贸neo es que preguntes en xharbour, ya que si revisas el c贸digo de esa clase ver谩s que no es "estandard"

regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion