[résolu] C++ et les horribles \0\0
Forum Programmation : [résolu] C++ et les horribles \0\0
Bonjour,
J'ai ecrit un programme serveur en C++ ( sous Dev Cpp ) et un programme client en VB 6.0. Ils marchent ( sisi ) mais il y a un probleme, car quand VB envoie une chaine avec :
Code :
|
le serveur recoit :
Code :
|
Or dans mon code en C++ il est ecrit :
Code :
|
donc buffer!=1
Comment puis j'enlever ces horribles zeros ???
Message édité par Hrusdik le 27-01-2008 à 18:48:35
Salut
tu devrais plutot poster le receive du serveur, voir le code du serveur entier si possible (sur past bin)
Message édité par Anonyme le 27-01-2008 à 14:19:39
si "buffer" est de type char *, ton test ne fait qu'une comparaison de pointeur (qui sont forcément toujours différents). En utilisant le strcmp, ça compare jusqu'au \0:
Code :
|
Et pense au '\0' pour les tailles des paquets envoyés.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
pour envoyer une chaine de caractères, il faut envoyer aussi le \0, sinon tu ne saura pas quand ta chaine finira, sauf si tu envoies la taille juste avant
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Mais de toute facon le VB ne remplira pas le reste avec des \0 tout moches ?
Et puis pendant que t'est la, pour envoyer un fichier il faut que je l'ouvre ne binaire et que j'envoye son contenu ( en bianire ) pour le recevoir et le placer dans un autre fichier ca sera ca a peu pres ?
Répondre à Hrusdik
Côté VB, je pense que ça dépend de la taille des buffers, mais je ne connais pas les sockets en VB, utilises-tu les fonctions de la win32 API ?
Pour le fichier c'est bien ça, mais je te conseille d'envoyer la taille des données qui suivent, car ça peut arriver en plusieurs fois.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Non j'ai ecrit cette fonction pour traiter les données rentrantes il pour un autre de mes programmes qui est un client et un serveur VB :
Code :
|
Comme ca quel que soit la taille des packets recus on a commeme un fichier compet a la fin.
Et coté serveur c'set tout bete :
Code :
|
Mais esque en C++ le coté serveur sera pareil ??? ( ca marrangerait xD )
Répondre à Hrusdik
Les Socket fonctionnent au niveau de l'OS, donc le fonctionnement est le même quel que soit le langage.
Peut-être qu'en VB il y a une surcouche, mais je ne crois pas. Je pense que le comportement en C++ est le même.
Dans ton exemple 100% VB, tu n'as pas de problème si tu envoies un fichier qui dépasse les 64ko ?
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
nono c'est le programme pour mettre a jour l'exe de mon MMORPG et il fonctionne nickel
Puisque il rajoute au fichier les packets de 64k tant que c'est pas la fin.
If DAFORM.ProgressBar1.Value = DAFORM.ProgressBar1.Max
Répondre à Hrusdik
Ah oui, j'avais pas bien lu. Donc, le même principe est à faire en C++.
S'il y a des \0 en trop à cause de VB, ce n'est pas bien grave si, en C++, tu conserves le même protocole que tu as définis dans ton code VB.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Je continue le post :
Donc j'ai un probleme c'est que mon programme serveur n'arrive pas a detecter que le client s'est deconnecté, donc le socket n'est plus en ecoute et au bout de deux connexion a mon programme serveur celui ci se bloque, voici le code
Code :
|
Ce code est basé sur l'exemple du site du zero.
EDIT:
En faite ce que je voudrais c'est que le serveur ferme le socket a la perte de connexion avec le client ( coupure d'internet ) et qu'il reouvre immediatement le socket pour que le client puisse se reconnecter mais au bout de deux connection le serveur bug et reponds plus
A mon humble avis c'est sock_err = listen (csock, 5); qui ne va pas, mais je ne sais pas comment le remplacer pour verifier si le client est toujours connecté !
Ps: Vive le VB franchement !
If Socket.State <> sckConnected Then
MsgBox "Client deconnecté !", vbInformation, "Erreur !"
End If
Et voilaaaaaaaaaaa, et en C/C++ il faut chercher dans une disaine de manuels pour trouver son bonheur xD
Message édité par Hrusdik le 29-01-2008 à 20:15:55
Répondre à Hrusdik
Il faut tester le retour de "recv":
- Si >0, c'est le nombre d'octets reçus
- Si ==0, la connexion est coupée
- Si <0, il y a une erreur socket
Même chose sur le "send"
Les listen et accept, c'est juste pour établir une connexion. Le accept est bloquant jusqu'à ce qu'un client se connecte sur le port écouté. A ce niveau, rien n'est connecté.
C'est send et recv qui font la communication, c'est donc sur eux qu'il faut tester si la communication est toujours présente. Le recv est bloquant en lecture, mais peut être débloqué si une erreur de connexion ou une perte de connexion se produit.
En VB c'est simple, mais en fait plus complexe parce que c'est une surcouche des sockets
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
J'ai trouvé ! Au lieu de chercher dans des bouquins ennuyeux, il faut demander a CRicky
Merci beaucoup, ca marche parfaitement bien.
Répondre à Hrusdik
Il y a 1682 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.
