Prima leggi i link di pablos, fai le tue ricerche e poi leggi il mio post.
]
Anche io ho avuto lo stesso tuo problema la prima volta che ho avuto una Ethernet Shield, ed ho risolto semplicemente integrando gli esempi Ethernet con quelli SD. Con piacere ti posto lo sketch che ho scritto per un webserver basico:
/*
Author: Antonio Ceccato
An Arduino W5100 based Ethernet SD Server, capable of serving HTML, PNG, JPEG, GIF and audio MP3 files
with any other filetype being sent as plain text. Be warned that the SD files are limited to 8.3 file names.
I suggest using "<img src="URL">" instead of base64 image encoding since it's faster.
*/
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 0, 177);
EthernetServer server(80);
File reqFile;
String request, strbuf;
char reqStr[32], dir[32];
void setup(){
pinMode(10, OUTPUT);
Serial.begin(9600);
Ethernet.begin(mac, ip);
server.begin();
if(!SD.begin(4)){
Serial.println("SD Init error!");
while(1);
}
else Serial.println("SD Init success!");
}
void loop(){
EthernetClient client = server.available();
if(client){
Serial.println();
Serial.println("Client connected.");
int i=0;
boolean currentLineIsBlank=true, firstLine=true;
while(client.connected()){
if(client.available()){
char c = client.read();
if(firstLine){
if(c=='\n'){
firstLine=false;
}
else{
reqStr[i] = c;
i++;
}
}
//Ora abbiamo reqStr che contiene la prima riga dell'header
if(c=='\n' && currentLineIsBlank){
//Legge la directory della richiesta
strbuf = String(reqStr); //SI PUO EVITARE di usare un char array sfruttando [] su String
request = strbuf.substring(4); //Toglie "GET "
request = request.substring(0, request.lastIndexOf(" HTTP/1.1")); //Toglie " HTTP/1.1" e lascia la directory
Serial.print("Request: ");
Serial.println(strbuf);
Serial.print("It wants: ");
Serial.println(request);
if(request.endsWith("/") || request == "/") request = request + "index.htm"; //Se la dir richiesta finisce con / o è solo /
if(!request.endsWith("/") && !(request[request.length()-4] == '.')) request = request + "/index.htm"; //Se la dir richiesta non finisce con /
//e non è un file *.3
request.toCharArray(dir, request.length()+1); //Converte String in char array
Serial.print("I send: ");
Serial.println(dir);
if(!SD.exists(dir)){
client.println("HTTP/1.1 404 Not Found");
client.println("Content-Type: text/html");
client.println("Connnection: close");
client.println();
client.println("<html><h2>404 Not Found</h2></html>");
break;
}
client.println("HTTP/1.1 200 OK");
if(request.endsWith(".htm")) client.println("Content-Type: text/html"); //File HTML
else if(request.endsWith(".png")) client.println("Content-Type: image/png"); //Immagine PNG
else if(request.endsWith(".gif")) client.println("Content-Type: image/gif"); //Immagine GIF
else if(request.endsWith(".jpg")) client.println("Content-Type: image/jpeg"); //Immagine JPEG
else if(request.endsWith(".mp3")) client.println("Content-Type: audio/mpeg"); //Audio MPEG
else client.println("Content-Type: text/plain"); //Caso default
client.println("Connnection: close");
client.println();
reqFile = SD.open(dir, FILE_READ);
while(reqFile.available()){
server.write(reqFile.read());
}
reqFile.close();
break;
}
if(c=='\n') currentLineIsBlank = true;
else if(c!='\r') currentLineIsBlank = false;
}
}
delay(1);
client.stop();
Serial.println("Client disconnected.");
for(int j=0; j<32; j++) reqStr[j] = '\0'; //Pulisce il buffer per evitare errori al prossimo giro
}
}
So che non è un gran ché commentato ma spero tu riesca a capire (se non riesci, prima cerca di capire gli esempi di Ethernet e SD). Questo server praticamente aspetta un client e la sua richiesta (in più logga tutto via Serial), estrapola dalla richiesta il file chiesto, invia gli header HTTP (decidendo il MIME type in base all'estensione del file [ad esempio text/html per .html, audio/mp3 per .mp3, text/plain per testo semplice o .txt], gestisce anche il 404 File not found), carica il file dall'SD e lo invia al client (senza passare per un buffer) e poi chiude aspettando altre connessioni. Il mio codice non è stato testato molto estensivamente ma non credo abbia bug troppo pesanti, oltre ad essere poco performante dato che non ci ho studiato tanto sopra.
Potendo essere di aiuto, ciao!
** Con quel codice, in download arrivo a 2,9KB/s tramite router ed indirizzo privato.