J'ai récemment acheté le livre "Techniques de Hacking" de Jon Erickson, au combien passionant ! La partie réseau est introduite (après 2 pages très résumées sur le modèle OSI) par la notion de sockets en C. J'en suis arrivé à réaliser un petit programme qui est censé identifier un serveur web ( en autre afficher la réponse qu'il me renvoie lorsque que je lui envoie la commande "HEAD / HTTP/1.0\r\n\r\n"
Mon problème est le suivant : contrairement aux exemples du livre dans lequel le serveur renvoie bien une réponse, chez moi ça ne 'fonctionne' pas.. Après quelques recherches, en tentant nottament l'expérience sur un serveur local, j'obtiens (sur le serveur) la sortie suivante :
/* Cette fonction accepte un descripteur de socket et un pointeur sur la chaîne à envoyer.
* Elle s'assure que tous les octets de la chaîne sont émis. Elle retourne 1 en cas de succès
* et 0 en cas d'échec.
*/
int send_string(int sockfd, unsigned char *buffer)
{
int sent_bytes, bytes_to_send;
bytes_to_send = strlen(buffer);
while(bytes_to_send > 0)
{
sent_bytes = send(sockfd, buffer, bytes_to_send, 0);
if(sent_bytes == -1)
return 0;
bytes_to_send -= sent_bytes;
buffer += sent_bytes;
}
return 1;
}
/* Cette fonction accepete un descripteur de socket et un pointeur sur le tampon de destination.
* Elle lit les données depuis la socket jusqu'à ce qu'elle rencontre la suite d'octets de fin de ligne
* (EOL). Ces octets snt lus depuis la socket mais le tamon de destination est clos avant ces octets.
* Elle retourne la taille de la ligne lue (sans les octets de fin)
*/
int recv_line(int sockfd, char* dest_buffer)
{
#define EOL "\r\n"
#define EOL_SIZE 2
unsigned char* ptr;
int eol_matched = 0;
ptr = dest_buffer;
while(recv(sockfd, ptr, 1, 0)) // On lit les octets un par un
{
if(*ptr == EOL[eol_matched])
{
eol_matched++;
if (eol_matched == EOL_SIZE)
{
*(ptr + 1 - EOL_SIZE) = '\0'; // On enlève les \r\n
return strlen(dest_buffer); // On retourne la taille
}
else
eol_matched = 0;
}
ptr++;
}
return 0;
}
Bon c'est ok: tu as une un serveur qui n'implemente pas cette fonction c'est tout! (bien que normalement d'après https://issues.apache.org/jira/browse/OLINGO-840 cela doit être une fonction obligatoire)
Je ne sais pas vraiment si j'en ai les droits mais j'ai tester sur plusieurs serveur tel que, microsoft, facebook, gmail etc ... Sans réponse à chaque fois
Je regarde les liens que tu m'as donné en espérant trouver des réponses !
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
git is great because Linus did it, mercurial is better because he didn't.