Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Winsock et passage de type

27 réponses
Avatar
Marc
Bonjour,

Est il possible, et comment, de passer un type avec winsock ?

du style


Public Type IndexAnnuaireCP
CP As String * 50
Adresse As String * 10
End Type


Public Annuaire As AnnuaireCP

passage:

Winsock1.SendData Annuaire

pour l'instant je ne trouve pas la solution.

Si cela est possible comment on la récupère à l'autre bout ?
et comment on appel dans ce cas Annuaire.CP ?

Par avance merci.

Marc

10 réponses

1 2 3
Avatar
Jean-marc
Jacques93 wrote:
Jean-marc a écrit :
Marc wrote:
Merci à tous les deux,



Je pense à une dernière question:
Est-il possible de creer un type (structure en C) en cours
d'execution.



Non, ni en VB ni en C d'ailleurs, et pour des raisons évidentes:
il faudrait alors que le prgramme génère à l'exécution du code
pour manipuler le nouveau type ...





Salut Jacques,

Pas tout à fait d'accord, mais c'est relativement lourd à mettre en
oeuvre. Nous avons réussi, je dis nous sans pédanterie, nous étions
plusieurs, il y a quelques années, à gérer en VB des fichiers Isam
Microfocus, dont la description originale était en Cobol Microsoft (Si
si, il a existé). Ce qui implique des formats de données inconnus de
VB (COMP-0, Comp-3 (très intéressant), Comp-5, Comp-X), avec
enregistrements de longueur variable, tout cela en séquentiel indexé.



J'ai pratiqué aussi ce genre là :-) Ah, les joies du BCD ! Et pour info,
un des produits de ma boite peut toujours utiliser des fichiers
ISAM Microfocus quand on l'installe dans un environnement dépourvu de
SGBD.

Ceci, dans une première phase, avec un .ini décrivant les divers
enregistrements et types de champs, ainsi que leur taille.
Cela suppose toutefois de connaitre les différentes structures que
l'on peut rencontrer.



Tout à fait d'accord. On peut toujours lire un format, si exotique soit
il et on peut toujours se créer une structure de données, y compris
dynamiquement, pour y faire entrer ce qu'on lit.

Ce qu'on ne sait pas faire, c'est créer un dynamiquement un vrai "Type"
au sens VB ou "struct" au sens du C. Mais on peut toujours créer une
structure de données flexible permettant de lire/écrire les données ainsi
lues.

J'avais participé précédemment aux mêmes genres de blagues en migrant
compilateur, et gestion de fichier de Dibol sous AIX, vers SCO Unix et
MS-DOS.

Dans tous les cas, ce fut une impasse, pas tellement en terme
technique, mais en terme de coût. Mais je parle ici de migration.



C'est souvent là ou le bât blesse.

Si on part de zéro, je me rappelle avoir lu, mais je ne sais plus où,
que l'important n'est pas l'algorithme, mais comment on structure ses
données



Ca, c'est bien sur très vrai.

Bonne journée !

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Marc
He bien oui j'en suis là maintenant !

J'ai donc deux machines, une cliente, un serveur.

2 apli VB qui tourne de chaque cotés.

Une relation entre les deaux avec Winsock.

Sur le client j'ai créer des fonctions genre CreateBD, CreateTable,
CreateIndex, AddNew(fonctionne pas), etc ...

Sur le serveur je recois tous ce petit monde, aucun probleme.

Mais quand je veux faire un put(Addnew) sur le serveur il me dit que ma
taille de Rec n'est pas bonne alors que j'ai un string de la même taille que
le len (d'ouverture du fichier random).

d'ou ma question sur les types.

J'ai un fichier sur le serveur avec la config, que j'avais prévu et qui se
fabrique avec CreateTable, du style: Nom(50), Prenom(50), etc... etc ...

Là je nage comment utiliser ce fichier afin de le passer en type, pour le
put et le get, ou comment fabriquer un string ou autre chose qui
fonctionnera avec le put ou le get ?

Par avance merci.

"Jacques93" a écrit dans le message de news:

Jean-marc a écrit :
Jacques93 wrote:



Drôle de pays tout de même, adresse sur 10, Code Postal sur 50 ???
Les facteurs vont avoir du boulot ;-)






Bonjour Jean-Marc,

Les fabricants d'enveloppes doivent aussi faire des formats
spéciaux:

+---------------------------------------------------------------+
| |
| ..... |
| . G . |
| . G . |
| ..... |
| |
| Mr Jean Dupont |
| 12345688228526974226325684623518395513848, Rue des tamaris |
| B - BizzarrVille - Bizzarland |
| |
+---------------------------------------------------------------+





Ben oui pour les enveloppes, mais en fait non, ça c'est le code postal de
Mr DuponD !!!

<http://www.chavaipa.com/wp-content/uploads/2008/11/tintin_dupont.jpg>

--

Cordialement,

Jacques.


Avatar
Jacques93
Marc a écrit :
He bien oui j'en suis là maintenant !

J'ai donc deux machines, une cliente, un serveur.

2 apli VB qui tourne de chaque cotés.

Une relation entre les deaux avec Winsock.



jusque là, OK

Sur le client j'ai créer des fonctions genre CreateBD, CreateTable,
CreateIndex, AddNew(fonctionne pas), etc ...

Sur le serveur je recois tous ce petit monde, aucun probleme.

Mais quand je veux faire un put(Addnew) sur le serveur il me dit que ma
taille de Rec n'est pas bonne alors que j'ai un string de la même taille que
le len (d'ouverture du fichier random).



Peux tu préciser ce que tu entends par put(Addnew). Quel code VB utilise
tu ?


d'ou ma question sur les types.

J'ai un fichier sur le serveur avec la config, que j'avais prévu et qui se
fabrique avec CreateTable, du style: Nom(50), Prenom(50), etc... etc ...

Là je nage comment utiliser ce fichier afin de le passer en type, pour le
put et le get, ou comment fabriquer un string ou autre chose qui
fonctionnera avec le put ou le get ?




Il me semble que Jean-Marc t'as proposé une solution, qui consiste à
concaténer les "String" de ta structure. Si tu as d'autres type dans ta
structure (int, long ...) tu peux les convertir en String, en prenant
garde à avoir une taille constante.

Si ta structure est complexe, nombre de champs et type de variable
nombreux, et / ou des structures imbriquées, la méthode utilisant
"CopyMemory" que j'ai indiqué dans les liens, est peut être plus
appropriée, en terme de lourdeur du code, ainsi qu'en performance.

--

Cordialement,

Jacques.
Avatar
Marc
Merci Jaques,

alors pour:

put (addnew) addnew est le nom de ma procedure.

je m'appercoit que l'on ne peut pas faire de append sans structure type a
moins que vous ayez une autre méthode et cela bloque tout mon travail:

exe:

Open "c:test.dat" For Random As #1 Len = 10
Put #1, 1, "AAAAAAAAAA"
Close #1

J'ai une erreur 59 taille incorrect
Je ne comprend pas len mon string ???????

En fait coté serveur je ne peut creer de structure fixe, elle est donnée par
le client au moment de la creation du fichier.
J'utilise le serveur comme mysql, j'envoi par l'intermediaire du client via
winsock des commandes: CreateBD, CreateTable et Create Index. Je stock dans
un fichier ini sur le serveur la structure de la table:
Exe:
NomClient(50)
PrenomClient(50)
etc ..

Après je ne peut pas reutiliser ces infos sauf en concatenant les donnees
envoyée par le client et j'essaye de l'ecrire avec un put dant le fichiet
dat avec random.
L'ouverture du fichier random se fait avec un len 98 et le string dans le
put fait 398 et j'ai toujours une erreur 59.
Je fais cela car je ne peut pas creer de structure type a partir de mon
fichier ini en cours d'execution.

Je ne suis pas sur d'être clair?

Bien cordialement

Marc

Marc a écrit :
He bien oui j'en suis là maintenant !

J'ai donc deux machines, une cliente, un serveur.

2 apli VB qui tourne de chaque cotés.

Une relation entre les deaux avec Winsock.



jusque là, OK

Sur le client j'ai créer des fonctions genre CreateBD, CreateTable,
CreateIndex, AddNew(fonctionne pas), etc ...

Sur le serveur je recois tous ce petit monde, aucun probleme.

Mais quand je veux faire un put(Addnew) sur le serveur il me dit que ma
taille de Rec n'est pas bonne alors que j'ai un string de la même taille
que le len (d'ouverture du fichier random).



Peux tu préciser ce que tu entends par put(Addnew). Quel code VB utilise
tu ?


d'ou ma question sur les types.

J'ai un fichier sur le serveur avec la config, que j'avais prévu et qui
se fabrique avec CreateTable, du style: Nom(50), Prenom(50), etc... etc
...

Là je nage comment utiliser ce fichier afin de le passer en type, pour le
put et le get, ou comment fabriquer un string ou autre chose qui
fonctionnera avec le put ou le get ?




Il me semble que Jean-Marc t'as proposé une solution, qui consiste à
concaténer les "String" de ta structure. Si tu as d'autres type dans ta
structure (int, long ...) tu peux les convertir en String, en prenant
garde à avoir une taille constante.

Si ta structure est complexe, nombre de champs et type de variable
nombreux, et / ou des structures imbriquées, la méthode utilisant
"CopyMemory" que j'ai indiqué dans les liens, est peut être plus
appropriée, en terme de lourdeur du code, ainsi qu'en performance.

--

Cordialement,

Jacques.


Avatar
Marc
Bon j'ai trouvé une solution , mais ca coince encore:

Comme cela ca fonctionne:

Dim Test as string * 10

Test="AAAAAAAAAA"
Open "c:test.dat" For Random As #1 Len = 10
Put #1, 1, Test
Close #1

Coté Serveur il faudrait pouvoir mettre dim Test as string * TailleRec
et la il veut une constante apres *.

(TailleRec etant la taille de la concatenation de tous les champs.)
La taille n'est pas dans le programme qui serra complilé, mais dans le
fichier ini.
Sinon plus d'interet d'avoir un serveur ... MDR

Décidement je vais finir par m'arracher les cheveux .....

Marc


Merci Jaques,

alors pour:

put (addnew) addnew est le nom de ma procedure.

je m'appercoit que l'on ne peut pas faire de append sans structure type a
moins que vous ayez une autre méthode et cela bloque tout mon travail:

exe:

Open "c:test.dat" For Random As #1 Len = 10
Put #1, 1, "AAAAAAAAAA"
Close #1

J'ai une erreur 59 taille incorrect
Je ne comprend pas len mon string ???????

En fait coté serveur je ne peut creer de structure fixe, elle est donnée
par le client au moment de la creation du fichier.
J'utilise le serveur comme mysql, j'envoi par l'intermediaire du client
via winsock des commandes: CreateBD, CreateTable et Create Index. Je stock
dans un fichier ini sur le serveur la structure de la table:
Exe:
NomClient(50)
PrenomClient(50)
etc ..

Après je ne peut pas reutiliser ces infos sauf en concatenant les donnees
envoyée par le client et j'essaye de l'ecrire avec un put dant le fichiet
dat avec random.
L'ouverture du fichier random se fait avec un len 98 et le string dans
le put fait 398 et j'ai toujours une erreur 59.
Je fais cela car je ne peut pas creer de structure type a partir de mon
fichier ini en cours d'execution.

Je ne suis pas sur d'être clair?

Bien cordialement

Marc

Marc a écrit :
He bien oui j'en suis là maintenant !

J'ai donc deux machines, une cliente, un serveur.

2 apli VB qui tourne de chaque cotés.

Une relation entre les deaux avec Winsock.



jusque là, OK

Sur le client j'ai créer des fonctions genre CreateBD, CreateTable,
CreateIndex, AddNew(fonctionne pas), etc ...

Sur le serveur je recois tous ce petit monde, aucun probleme.

Mais quand je veux faire un put(Addnew) sur le serveur il me dit que ma
taille de Rec n'est pas bonne alors que j'ai un string de la même taille
que le len (d'ouverture du fichier random).



Peux tu préciser ce que tu entends par put(Addnew). Quel code VB utilise
tu ?


d'ou ma question sur les types.

J'ai un fichier sur le serveur avec la config, que j'avais prévu et qui
se fabrique avec CreateTable, du style: Nom(50), Prenom(50), etc... etc
...

Là je nage comment utiliser ce fichier afin de le passer en type, pour
le put et le get, ou comment fabriquer un string ou autre chose qui
fonctionnera avec le put ou le get ?




Il me semble que Jean-Marc t'as proposé une solution, qui consiste à
concaténer les "String" de ta structure. Si tu as d'autres type dans ta
structure (int, long ...) tu peux les convertir en String, en prenant
garde à avoir une taille constante.

Si ta structure est complexe, nombre de champs et type de variable
nombreux, et / ou des structures imbriquées, la méthode utilisant
"CopyMemory" que j'ai indiqué dans les liens, est peut être plus
appropriée, en terme de lourdeur du code, ainsi qu'en performance.

--

Cordialement,

Jacques.






Avatar
Jean-marc
Marc wrote:
Bon j'ai trouvé une solution , mais ca coince encore:

Comme cela ca fonctionne:

Dim Test as string * 10

Test="AAAAAAAAAA"
Open "c:test.dat" For Random As #1 Len = 10
Put #1, 1, Test
Close #1

Coté Serveur il faudrait pouvoir mettre dim Test as string *
TailleRec et la il veut une constante apres *.

(TailleRec etant la taille de la concatenation de tous les champs.)
La taille n'est pas dans le programme qui serra complilé, mais dans le
fichier ini.
Sinon plus d'interet d'avoir un serveur ... MDR

Décidement je vais finir par m'arracher les cheveux .....



Hello,

Rien de sorcier cependant. Mais il faut lire la doc de Put dans l'aide de VB
qui explique clairement comment faire.
Je cite :

"If the variable being written is a Variant of VarType 8 (String),
"Put writes 2 bytes identifying the VarType, 2 bytes indicating
the length of the string, and then writes the string data. The
record length specified by the Len clause in the Open statement
must be at least 4 bytes greater than the actual length
of the string."


Ici, c'est tout simple :

Dim f As Integer
Dim TailleRecord As Long
Dim s As Variant
Dim buffer As String

' taille reçue du serveur
TailleRecord = 20

s = Space$(TailleRecord)

' données reçues du serveur, peut même être moins
' que 20
buffer = "1234657890"

' on met dans s
Mid$(s, 1, TailleRecord) = buffer

' et on écrit - Noter le "+4"
f = FreeFile
Open "c:tutu.txt" For Random As #f Len = TailleRecord + 4
Put #f, 1, s
Close #f

' prouvons que cela marche :

buffer = ""
f = FreeFile
Open "c:tutu.txt" For Random As #f Len = TailleRecord + 4
Get #f, 1, s
Close #f

buffer = CStr(s)

Debug.Print "->" & buffer & "<- " & len(buffer)


L'astuce, c'est le "+ 4" : 2 bytes pour le type de variant et 2 bytes
pour la longueur de la chaine, que chaque Put va écrire devant les
données, pour chaque record.

On notera que c'est un des rares cas ou l'utilisation d'un
variant est judicieuse.

Ton problème est donc réglé :-)


--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Marc
Grand Merci Jean-Marc :)

Ca marche super bien.

Tu me sauves la mise car je ne comprenais plus rien.
Cela me cassait vriament les pieds d'être obliger de ne pas fonctionner mon
logiciel avec un serveur et plusieurs clients.
le coup des 4 alors là ........
Je me doutais qu'il y'avais un stockage quelque part.

Le put tu as trouvé ca ou dans la le msdn fourni avec le packacge VB6 ?

Encore merci parce que la vraiment, chercher dans tous les sens plus les
gamins en vacances à la maison ....

Marc

"Jean-marc" a écrit dans le message de news:
4aeb1a8a$0$2862$
Marc wrote:
Bon j'ai trouvé une solution , mais ca coince encore:

Comme cela ca fonctionne:

Dim Test as string * 10

Test="AAAAAAAAAA"
Open "c:test.dat" For Random As #1 Len = 10
Put #1, 1, Test
Close #1

Coté Serveur il faudrait pouvoir mettre dim Test as string *
TailleRec et la il veut une constante apres *.

(TailleRec etant la taille de la concatenation de tous les champs.)
La taille n'est pas dans le programme qui serra complilé, mais dans le
fichier ini.
Sinon plus d'interet d'avoir un serveur ... MDR

Décidement je vais finir par m'arracher les cheveux .....



Hello,

Rien de sorcier cependant. Mais il faut lire la doc de Put dans l'aide de
VB
qui explique clairement comment faire.
Je cite :

"If the variable being written is a Variant of VarType 8 (String),
"Put writes 2 bytes identifying the VarType, 2 bytes indicating
the length of the string, and then writes the string data. The
record length specified by the Len clause in the Open statement
must be at least 4 bytes greater than the actual length
of the string."


Ici, c'est tout simple :

Dim f As Integer
Dim TailleRecord As Long
Dim s As Variant
Dim buffer As String

' taille reçue du serveur
TailleRecord = 20

s = Space$(TailleRecord)

' données reçues du serveur, peut même être moins
' que 20
buffer = "1234657890"

' on met dans s
Mid$(s, 1, TailleRecord) = buffer

' et on écrit - Noter le "+4"
f = FreeFile
Open "c:tutu.txt" For Random As #f Len = TailleRecord + 4
Put #f, 1, s
Close #f

' prouvons que cela marche :

buffer = ""
f = FreeFile
Open "c:tutu.txt" For Random As #f Len = TailleRecord + 4
Get #f, 1, s
Close #f

buffer = CStr(s)

Debug.Print "->" & buffer & "<- " & len(buffer)


L'astuce, c'est le "+ 4" : 2 bytes pour le type de variant et 2 bytes
pour la longueur de la chaine, que chaque Put va écrire devant les
données, pour chaque record.

On notera que c'est un des rares cas ou l'utilisation d'un
variant est judicieuse.

Ton problème est donc réglé :-)


--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;






Avatar
Jean-marc
Marc wrote:
Grand Merci Jean-Marc :)



De rien :-)

Ca marche super bien.



Content de l'entendre !

Tu me sauves la mise car je ne comprenais plus rien.
Cela me cassait vriament les pieds d'être obliger de ne pas
fonctionner mon logiciel avec un serveur et plusieurs clients.
le coup des 4 alors là ........
Je me doutais qu'il y'avais un stockage quelque part.

Le put tu as trouvé ca ou dans la le msdn fourni avec le packacge VB6



Tout à fait. Dans l'aide en ligne, ou alors sur Internet dans le MSDN
livre : http://msdn.microsoft.com/en-us/library/aa266212(VS.60).aspx


Encore merci parce que la vraiment, chercher dans tous les sens plus
les gamins en vacances à la maison ....



J'ai aussi une fille de 1 an, c'est vrai : ça n'aide pas :-))

Bien cordialement,

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Marc
Re-Bonjour à tous,

J'ai encore une question sur les type

peut on passer un type en argument à une fonction ?

Sachant que cette fonction peut recevoir plusieurs type
différents(différents enregistrements de taille différents)

Par avance merci

Marc

"Jean-marc" a écrit dans le message de news:
4aeb5ff4$0$2855$
Marc wrote:
Grand Merci Jean-Marc :)



De rien :-)

Ca marche super bien.



Content de l'entendre !

Tu me sauves la mise car je ne comprenais plus rien.
Cela me cassait vriament les pieds d'être obliger de ne pas
fonctionner mon logiciel avec un serveur et plusieurs clients.
le coup des 4 alors là ........
Je me doutais qu'il y'avais un stockage quelque part.

Le put tu as trouvé ca ou dans la le msdn fourni avec le packacge VB6



Tout à fait. Dans l'aide en ligne, ou alors sur Internet dans le MSDN
livre : http://msdn.microsoft.com/en-us/library/aa266212(VS.60).aspx


Encore merci parce que la vraiment, chercher dans tous les sens plus
les gamins en vacances à la maison ....



J'ai aussi une fille de 1 an, c'est vrai : ça n'aide pas :-))

Bien cordialement,

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;






Avatar
jean-marc
"Marc" wrote in message
news:
Re-Bonjour à tous,



Hello,

J'ai encore une question sur les type
peut on passer un type en argument à une fonction ?
Sachant que cette fonction peut recevoir plusieurs type
différents(différents enregistrements de taille différents)
Par avance merci



pas sur de comprendre la question. On peut passer
autant d'arguments que l'on veut à une fonction ?
La encore, simple question de design de l'application.


--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;




1 2 3