1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
| // Création du socket
if( ( ListeningSocket = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP ) ) == INVALID_SOCKET ){
cerr << "ne peut créer la socket. Erreur n° " << WSAGetLastError()<< endl;
WSACleanup();
return 1;
}
// bind fournit à la socket ListeningSocket, l'adresse locale (SOCKADDR *)&ServerAddr. L'adresse est longue de sizeof( ServerAddr ) octets.
if( bind( ListeningSocket, (SOCKADDR *)&ServerAddr, sizeof( ServerAddr ) ) == SOCKET_ERROR ){
cerr << "bind a échoué avec l'erreur " << WSAGetLastError() << endl;
cerr << "Le port est peut-être déjà utilisé par un autre processus " << endl;
closesocket( ListeningSocket );
WSACleanup();
return 1;
}
// Connection (côté client)
erreur=connect(NewConnection,(struct sockaddr*)&ServerAddr,sizeof(ServerAddr));
if (erreur!=0)
printf("\nDesole, je n'ai pas pu ouvrir la session TCP : %d %d",erreur,WSAGetLastError());
else
printf("\nsetsockopt : OK");
// Ecoute sur le port
if( listen( ListeningSocket, 5 ) == SOCKET_ERROR ){
cerr << "listen a échoué avec l'erreur " << WSAGetLastError() << endl;
closesocket( ListeningSocket );
WSACleanup();
return 1;
}
cout << "serveur démarré : à l'écoute du port " << port << endl;
running = true;
ClientAddrLen = sizeof( ClientAddr );
while(running){
// Acceptation de la connexion
if((NewConnection = accept( ListeningSocket, (SOCKADDR *) &ClientAddr, &ClientAddrLen)) == INVALID_SOCKET){
cerr << "accept a échoué avec l'erreur " << WSAGetLastError() << endl;;
closesocket( ListeningSocket );
WSACleanup();
return 1;
}
p.ser = this;
p.soc = NewConnection;
cout << "client connecté :: IP : " <<inet_ntoa( ClientAddr.sin_addr )<< " ,port = " <<ntohs( ClientAddr.sin_port ) << endl;
// Création du thread contenant le serveur
hProcessThread = CreateThread(NULL, 0,&serveur::ThreadLauncher, &p,0,NULL);
if ( hProcessThread == NULL ){
cerr << "CreateThread a échoué avec l'erreur " <<GetLastError()<< endl;
}
// Prise d'information sur le pirate connecté
cout << system("whois") << endl ;
// Envoi des données côtté client
strcpy(buffer,"Bienvenu sur le serveur Apache/ 1.3.27 <HTML><HEAD><TITLE>400 Bad Request</TITLE></HEAD><BODY><H1>Bad Request</H1>Your browser sent a request that this server could not understand.<P>The request line contained invalid characters following the protocol string.<P><P><HR><ADDRESS> 192.168.1.30 at & Port 80</ADDRESS></BODY></HTML>"); // Copie la chaine de caractère dans buffer
nombre_de_caractere=send(NewConnection,buffer,strlen(buffer),0);
if (NewConnection==SOCKET_ERROR)
printf("\nDesole, je n'ai pas envoyer les donnees du a l'erreur : %d",WSAGetLastError());
else
printf("\nsend : OK");
// Reception des données
nombre_de_caractere=recv(NewConnection,buffer,1515,0) ;
if (nombre_de_caractere==SOCKET_ERROR)
cout << "Desole, je n'ai pas recu de donnee" << endl ;
else
{
buffer[nombre_de_caractere]=0; // Permet de fermer le tableau après le contenu des data, car la fonction recv ne le fait pas
cout << "\nVoici les donnees : " << buffer << endl ;
}
// Fermeture de la session TCP Correspondant à la commande connect()
erreur=shutdown(NewConnection,2); // 2 signifie socket d'émission et d'écoute
if (erreur!=0)
printf("\nDesole, je ne peux pas fermer la session TCP du a l'erreur : %d %d",erreur,WSAGetLastError());
else
printf("\nshutdown : OK");
// Envoi et reception des données.
bytesSent = send( NewConnection, sendbuf, strlen(sendbuf), 0 );
printf( "Bytes Sent: %ld\n", bytesSent );
while( bytesRecv == SOCKET_ERROR ) {
bytesRecv = recv( NewConnection, recvbuf, 32, 0 );
if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) {
printf( "Connection Closed.\n");
break;
}
printf( "Bytes Recv: %ld\n", bytesRecv );
cout << "c'es bon 3" << endl ;
}
}
return 0;
} |
Partager