IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

C socket fichier apache


Sujet :

Réseau C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut C socket fichier apache
    Bonjour à tous,

    Voilà... le gros est dans le titre.
    Je cherche, au travers des socket, envoyer un fichier à l'Apache par requete multipart/form-data (equivalent au formulaire...)

    J'arrive à communiquer avec l'Apache, mais il me renvoie la page à chaque fois...
    Meme en mode debug, il me cause pas (trop) plus.

    Bref, si qq c'est déjà amuser avec ca, j'suis preneur.

    En vous remerciant,

  2. #2
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    j'ai pas compris le pb :s

  3. #3
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Pas mieux que hiko-seijuro.

    Tu veux faire quoi au juste ?
    Envoyer un fichier via un formulaire qui se trouve sur un site ?

    Pis multipart/form-data c'est pas une requête.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    D'abord, merci les gars de vous y interresser...

    Le principe que j'aimerais effectuer est :
    A partir d'un exécutable C (de pref), y indiquer un fichier en argument.
    Le binaire de connecte au port 80 de l'apache et y envoie le fichier.


    Ce qui revient, à peux de chose, à un formulaire.

    Le souci que j'ai, c'est que l'apache me repond correctement pour lui, mais c tout. j'arrive pas à lui faire avaler le doc.

    Bref, si vous avez une idée, j'suis preneur.
    Merci

  5. #5
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    Salut,
    c'est juste une requete http PUT au lieu de POST:s

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    Ok, merci,
    J'ai vu le principe...
    J'ai malgrès 2 pb :
    1. si je met pas une ligne du style "Script PUT /put.php" dans le httpd.conf avec le script php qui convient, l'apache me dit "HTTP/1.1 405 Method Not Allowed"
    2. avec le script, ca me convien, mais je n'ai aucune variable qui m'indique ou est le fichiers temporaire... meme dans les $_SERVER j'n'ai rien.

    Avez vous déjà effectuer cette manip, connaissez vous une bonne faq complete... j'arrive pas a mettre la main sur un RTFM complet....

    Merci d'avance,

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    Re...
    J'ai trouver un bout de code exemple pour réceptionner le PUT par l'ouverture du descripteur php//stdin ou php://input.... dans mon cas, les deux sont vides.

    Je fais le put par un bout de code C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    strcpy(canal[0],"PUT /put.php HTTP/1.0\n\n");
      strcpy(canal[1],"Host:marmotte\n\n");
      strcpy(canal[2],"Content-length: 20\n\n");
      strcpy(canal[3],"Test 1234\n\n");
     
      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(80); 
     
      for(i=0;i<3;i++)  strcat(str,canal[i]);
      send(sock, str, strlen(str), 0); // on envoie la requête HTTP.
      j = recv(sock, buffer, sizeof(buffer), 0); 
      printf("\n%s",buffer);
    Bref, apriori j'envoie bien mes data et ma log acces d'apache confirme la connection, mais j'arrive pas coté apache à récupere mes data...


  8. #8
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    est ce que le fichier de configuration de ton serveur http autorise le put ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    J'craque

    Apparement, le mod_put.so n'est plus plublier avec l'Apache....
    Le pire, c'est qu'il me dit rien dans les log.... j'pense pas que c'est une merde de config.

    Coté apache, voici la page put.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    if ($_SERVER['REQUEST_METHOD'] == "PUT"){
      $filename = "sendfile";
      $totalWritten = 0;
      $inFP  = fopen( "php://stdin", "rb" );
      $outFP = fopen( $filename, "wb" );
      while( $data = fread( $inFP, 1024 ) )
      {
              fwrite( $outFP, $data );
              $totalWritten += strlen( $data );
      }
      fclose($inFP);
      fclose($outFP);
     
      if( $totalWritten ) header( "HTTP/1.0 200 Success ($filename)");
      else                header( "HTTP/1.0 404 Failed ($filename)");
    }
    J'me paye une 404 car le stdin est vide (j'ai essayer avec l'input, pareil)


    Donc pourquoi coté emission, il me dit rien et pourquoi coté apache, il recoit rien OU il m'écrit rien...

  10. #10
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    Il faut procéder par étape.

    Si le système HTTP ne supporte pas le PUT il sortira un 405 METHOD NOT ALLOWED, que ton client devrait récupérer grâce au printf(buffer) Entre parenthèses buffer[j]='\0' est requis avant le printf.

    devrait oui, sauf que Apache ne dit rien dans les logs tout simplement parce qu'il ne fait rien!

    Dans la requête HTTTP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	PUT /put.php HTTP/1.0\n\n
    	Host:marmotte\n\n
    ... Le serveur stoppe au premier \n\n. En d' autres termes il faut terminer la requête par \n\n ça doit être noté quelque part dans la RFC 2616.

    Et le "PUT /put.php" n'est pas clair. Fais "PUT /test.txt" plutôt. En sachant qu'Apache -s'il est correctement configuré- redirigera tous les PUT sur le script précisé dans la config.

  11. #11
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Le séparateur entre 2 lignes c'est CRLF autrement dis \r\n et pour la fin de commande c'est \r\n\r\n sur une seule ligne

    http://mathieu-lemoine.developpez.co...iels/web/http/

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    Ok, merci les gars...

    Bon, j'ai corriger mon code C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      strcpy(canal[0],"PUT /put.txt HTTP/1.0\r\n");
      strcpy(canal[1],"Host:marmotte\r\n");
      strcpy(canal[2],"Content-type: text/html\r\n");
      strcpy(canal[3],"Content-length: 10\r\n");
      strcpy(canal[4],"012345\r\n");
      strcpy(canal[5],"67889\r\n\r\n");
    Voici la réponse d'apache :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    HTTP/1.1 400 Bad Request
    Date: Thu, 04 Jan 2007 09:04:16 GMT
    Server: Apache/1.3.33 (Win32) PHP/4.3.10
    Connection: close
    Content-Type: text/html; charset=iso-8859-1
     
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <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>
    Request header field is missing colon separator.<P>
    <PRE>
    012345</PRE>
    <P>
    <HR>
    <ADDRESS>Apache/1.3.33 Server at <A HREF="mailto:admin@localhost">localhost</A>
    Port 80</ADDRESS>
    </BODY></HTML>
    Erreur notifié dans le error.log d'apache :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    request failed: error reading the headers
    Ceci depuis les \r\n, avec les \n\n il me disait rien, mais c'est certainement normal puisque comme vous me l'aviez précisé, le \n\n sont pour finir.

    Et coté script php, toujours rien dans le stdin ou input.

    Et coté RFC, pas grandes infos... J'trouve les manip pour récupéré les PUT (coté apache et php) mais y a personne qui précise la manip pour emettre... si, pardon, via telnet.... :-$

    Voili....

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    J'viens de m'appercevoir d'une chose en mettant le précédent post.
    L'apache me dis que le header est mal formaté.... et s'arrete sur
    Est ce qu'il y a une syntaxe pour envoyer les données....?

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    Yaou !!!!
    Laissez tombé les gars,

    C bon, résolu

    Code C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      strcpy(canal[0],"PUT /put.txt HTTP/1.0\r\n");
      strcpy(canal[1],"Host:marmotte\r\n");
      strcpy(canal[2],"Content-type: text/html\r\n");
      strcpy(canal[3],"Content-length: 20\r\n\r\n");
      strcpy(canal[4],"<HTML><BODY>\r\n");
      strcpy(canal[5],"67889\r\n\r\n");
    J'ai essayé sans commencé par <HTML><BODY> et il en veux pas !

    Bref...

    Ajouté à la conf apache :
    Page put.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    if ($_SERVER['REQUEST_METHOD'] == "PUT"){
      $filename = "sendfile";
      $totalWritten = 0;
      $inFP  = fopen( "php://input", "rb" );
      $outFP = fopen( $filename, "wb" );
      while( $data = fread( $inFP, 1024 ) )
      {
              fwrite( $outFP, $data );
              $totalWritten += strlen( $data );
      }
      fclose($inFP);
      fclose($outFP);
     
      if( $totalWritten ) header( "HTTP/1.0 200 Success ($filename)");
      else                header( "HTTP/1.0 404 Failed ($filename)");
    }
    Voili.... mes data envoyé (<HTML><BODY>\r\n67889\r\n\r\n) se sont retrouvés écrit dans la page "sendfile" sous la racine du serveur.

    En vous remerciant de votre aide....

    Merci, bye

  15. #15
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    "Le séparateur entre 2 lignes c'est CRLF"
    Les deux sont autorisés, (cf 19.3 et 19.4.2 RFC 2616). De plus Apache est issu du monde unix, il comprend bien qu'il faut participer à l' économie des octets.
    Bonne prog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Nombre de fichiers Apache excessif ?
    Par omelhor dans le forum Apache
    Réponses: 6
    Dernier message: 17/06/2013, 16h22
  2. Réparer le fichier apache/logs/httpd.pid overwritten
    Par laplumedoie dans le forum Apache
    Réponses: 9
    Dernier message: 27/02/2012, 10h08
  3. Restriction fichier apache
    Par nicoweb371 dans le forum Apache
    Réponses: 3
    Dernier message: 19/10/2006, 14h50
  4. [Socket]envoie de fichier!!!
    Par SamDaKap dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/11/2002, 08h07
  5. transfert d'un fichier bitmap en socket tcp
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/07/2002, 00h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo