Bonsoir tout le monde !
Je me suis mis au C/C++ sous linux il y a quelques jours et j'ai de nombreuses erreur de dépassement de tampon (segmentation fault).
Voici mon code complet, c'est un scanneur de port multithreaded qui me sert de test pour voir si je suis capable de coder un programme gérant socket et multithreading (humm !). Mais le problème ne se situe pas sur ces difficultés !
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <iostream.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <pthread.h>
typedef struct MTConnectArg
{
char* Host;
int Port;
};
const int DebugMode = 1;
void* Connect(void* thrArg)
{
MTConnectArg* Param = (MTConnectArg*)thrArg;
// variables necessaires au TimeOut
struct timeval TV;
fd_set myset;
if(DebugMode == 1) cout << "### Debug - Initialisation de la connexion..." << endl;
// Création du socket
int SktDesc = socket(AF_INET, SOCK_STREAM, 0);
if(DebugMode == 1) cout << "### Debug - Resolve de l'adresse..." << endl;
// Variable gérant l'adressage et le resolve du nom de domaine
struct sockaddr_in SktIn;
struct hostent *ResolvedHost = gethostbyname(Param->Host);
if(DebugMode == 1) cout << "### Debug - Configuration du socket..." << endl;
long Arg= 0;
// Mise en place d'un socket non blocant
Arg = fcntl(SktDesc, F_GETFL, NULL);
Arg |= O_NONBLOCK;
fcntl(SktDesc, F_SETFL, Arg);
// On set les paramètres du socket
memset(&SktIn, 0, sizeof(SktIn));
memcpy((char *) &SktIn.sin_addr.s_addr, ResolvedHost->h_addr_list[0], ResolvedHost->h_length);
SktIn.sin_family = AF_INET;
SktIn.sin_port = htons(Param->Port);
if(DebugMode == 1) cout << "### Debug - Connexion..." << endl;
int SktRet = connect(SktDesc, (struct sockaddr *)&SktIn, sizeof(SktIn));
if (SktRet < 0)
{
// Vérification du TimeOut
TV.tv_sec = 1;
TV.tv_usec = 0;
FD_ZERO(&myset);
FD_SET(SktDesc, &myset);
if (select(SktDesc+1, NULL, &myset, NULL, &TV) <= 0)
{
cout << "### Debug - TimeOut..." << endl;
}
else
{
cout << "Open port : " << Param->Port << " !";
if(DebugMode == 1) cout << "### Debug - Connexion réussie..." << endl;
if(DebugMode == 1) cout << "### Debug - Fermeture du socket..." << endl;
close(SktDesc);
}
}
else
{
if(DebugMode == 1) cout << "### Debug - Connexion échouée..." << endl;
}
}
int main(int argc, char* argv[])
{
char Host[256];
int StartPort = 0;
int EndPort = 0;
int ThreadLimit = 0;
MTConnectArg* Param;
cout << "DGSCan Port Scanner...\nMultithreaded !\n\n";
cout << "Thread Limit : ";
cin >> ThreadLimit;
pthread_t* thrList = (pthread_t*)malloc(sizeof(pthread_t) * ThreadLimit);
cout << "Host : ";
cin >> Host;
cout << "Start port :";
cin >> StartPort;
cout << "End port :";
cin >> EndPort;
Param->Host = Host;
cout << "\nDébut du scan sur " << Host << " ..." << endl;
for(int i = StartPort; i < EndPort; i+= ThreadLimit)
{
cout << "Analyse du port "<< i << " ...";
for(int j = 0; j < ThreadLimit; j++)
{
cout << "### Debug - Création du lot de thread..." << endl;
Param->Port = i + j;
if(j < EndPort - StartPort)
{
cout << "### Debug - Création du thread..." << endl;
pthread_create(&thrList[j], NULL, Connect, (void*)Param);
}
}
}
return 0;
}
Je vous met aussi le dump GDB si ca peut vous aider :
Starting program: /home/digitalguru/Bureau/Developpement/DGScan V2/DGScanV2
[Thread debugging using libthread_db enabled]
DGSCan Port Scanner...
Multithreaded !
Thread Limit : 10
Host : google.fr
Start port :1
End port :100
[New Thread 0x7f81f35986f0 (LWP 6549)]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7f81f35986f0 (LWP 6549)]
0x000000000040111e in main (argc=1, argv=0x7ffffb5aea18) at main.c:119
119 Param->Host = (char*)malloc(sizeof(char) * strlen(Host));
Current language: auto; currently c++
Voilà, si quelqu'un a une idée de comment m'en sortir !
Sinon, soyez indulgent sur mon "style" qui doit probablement être assez dégueulasse, car je viens d'une multitude de langage et je ne suis pas très habitué ni aux pointeurs, ni au standart d'écriture du C++.
Je prend bien sûr toutes les remarques

Tchou ! Et merci d'avance !
-=Digital Guru=-