Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    far spedire dati (binari) ad un cgi

    Avevamo un cgi (scritto in c non in perl) che era usato insieme ad un webserver
    proprietario realizzato dalla mia ditta... ora si é deciso di usare Apache.

    Lo scopo di questo cgi era di aprire un file contenente un immagine in formato raw
    (un binariaccio senza header ne`niente) e spedirla su socket.
    Un applet java chiamava questo cgi con i parametri opportuni e si occupava poi
    di convertire le immagini raw e di visualizzarle a gruppi di 4.

    Il problema?
    Col vecchio webserver il tutto funzionava perfettamente... Apache invece si rifiuta
    categoricamente di spedire i dati... io speravo di aprire il cgi da browser e chiedendogli
    l'immagine vedere apparire delle scritte strane (veniva infatti inviata all'Applet come testo)
    invece in qualche modo un pezzo dei dati mi sovrascrive l'header...
    tornando come indietro


    Prima di tutto comunico ad apache che cioè che segue é testo:

    fprintf(stdout, "Content-Type: text/plain\r\n\r\n"); // In origine era una printf()

    Poi chiamo la mia_routine() che spedisce l'immagine come testo
    eseguendo le seguenti operazioni:

    1) Apre il file in sola lettura
    2) Malloca il buffer sorgente definito come "unsigned char*" (le immagini raw hanno tutte
    una dimensione fissa... credo siano opportunamente paddate)
    3) Legge il file per mezzo di una semplice read() nel buffer sorgente
    4) Esegue un eventuale sottocampionamento dell'immagine facendo dei folli
    "giochi di puntatori" copiando infine il risultato ottenuto
    in un buffer destinazione sempre "unsigned char*"
    5) Invia il buffer destinazione:
    inizialmente lo facevo con una semplice printf:
    printf("%.*s", dst_size, dst);
    ma poi ho provato anche con una write() su stdout cosí:
    fd_out = fileno(stdout);

    if (write(fd_out, dst, dst_size) != dst_size) {
    printf("Errore fatale...");

    sperando fosse colpa della printf() che magari con quei caratteri strani si incasinava...

    La cosa strana é che con le printf() di debug vedo che la mia funzione termina in modo corretto peccato che in qualche modo si sovrascriva l'header

    Ho provato anche cambiando il content-type con application/octect-stream ottenendo
    dei risultati a dir poco ridicoli... pagine vuote o tentativi di farmi scaricare la cgi stessa (NON
    l'immagine che mi sarei magari potuto accontentare) di 0 byte peró :rollo:

    Se provo invece ad aprire un file dui testo vero (omettendo i rimpicciolimenti) il testo viene trasferito correttamente...

    Non riesco a capire cosa c'é che non va...
    Avete qualche suggerimento da darmi???

    Son da 4 giorni che son con sto errore 500 malefico!!!

    Grazie!!!

    fano_il_primo

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Riporto alcuni errori gia` visti in queste pagine.

    Il Webserver accetta CGI solo se sono inseriti in una dir particolare che lui conosce (occorre configurare il webserver perche` accetti la dir come contenente CGI).

    Le permission (della dir e dei file contenuti) devono essere corrette.

    Il CGI deve essere compilato per quel sistema operativo.
    Se linux il compilato deve contenere all'inizio il linguaggio in cui e` scritto/compilato o l'interprete da usare (sono pochi byte scritti in ASCII);
    se windows l'estensione del file deve essere corretta e configurata nel SO.

    Se non capisci o se hai ancora problemi, fai riferimento al sito di Shishii, che contiene info utili anche in questo campo.

    Altrimenti posta ancora: io non saprei darti altre info, ma altri forse si`.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    Originariamente inviato da Mich_
    Riporto alcuni errori gia` visti in queste pagine.

    Il Webserver accetta CGI solo se sono inseriti in una dir particolare che lui conosce (occorre configurare il webserver perche` accetti la dir come contenente CGI).

    Le permission (della dir e dei file contenuti) devono essere corrette.
    La directory ed i permessi erano settati in modo corretto infatti lo script veniva eseguito
    (ho scritto delle trace di debug su file e vedevo che era eseguito e giungeva anche correttamente alla fine)

    Originariamente inviato da Mich_
    Il CGI deve essere compilato per quel sistema operativo.
    Se linux il compilato deve contenere all'inizio il linguaggio in cui e` scritto/compilato o l'interprete da usare (sono pochi byte scritti in ASCII);
    se windows l'estensione del file deve essere corretta e configurata nel SO.
    Di questo non ne ero a conoscenza... forse se e` scritto in C non e` necessario???
    C'era un altro cgi fatto da un collega (un po` piu` semplice a dire il vero) e non vi era
    nessuna indicazione... del resto viene compilato e Apache lancia l'eseguibile .cgi.


    Originariamente inviato da Mich_
    Se non capisci o se hai ancora problemi, fai riferimento al sito di Shishii, che contiene info utili anche in questo campo.

    Altrimenti posta ancora: io non saprei darti altre info, ma altri forse si`.
    Grazie dell'aiuto comunque ho risolto da solo

    Praticamente pare colpa della write() sostituendola con:

    fwrite(dst, 1, dst_size, stdout);

    Ha magicamente funzionato... tra l'altro non sembra fare gran differenza il content/type
    se lascio text/plain appare su Firefox una pagina piena di robaccia.. se metto octectstream
    invece mi chiede di salvare un file che e` poi l'immagine...
    Internet Explorer su Windows invece chiede di salvare in ogni caso...

    All'applet van bene entrambi... chissa` cosa sara` meglio???

    Ciao,
    fano_il_primo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.