Arduino Ethernet Shield - 对服务器的GET请求没有响应

时间:2014-01-16 13:23:52

标签: http-headers arduino

我有一个Arduino Ethernet Shield代码,它会向服务器发送一个GET请求并返回一个PHP echo语句。

但是,大多数情况下它无法连接到服务器。

当它连接时,我不断收到403 Forbidden错误或者说“Host:”的错误标题格式。

我已经检查了与该主题相关的每个论坛和所有StackOverflow链接,但没有一个解决方案有效。我的代码附在下面。

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char server[] = "kanishkaganguly.byethost5.com";
IPAddress ip(192,168,0,103);

EthernetClient client;

void setup() {
 Serial.begin(9600);
 while (!Serial) {
    ;
 }

 Ethernet.begin(mac, ip);

 delay(1000);
 Serial.println("connecting...");

 if (client.connect(server, 80)) {
    Serial.println("connected");
    client.println("GET /test.php HTTP/1.1");
    client.println("Host: www.arduino.cc");
    client.println("User-Agent: arduino-ethernet");
    //client.println("User-Agent: Mozilla/5.0"); 
    //This supposedly fixed 403 error for another user
    client.println("Connection: close");
    client.println();
 }else {
    Serial.println("connection failed");
 }
}

void loop(){
  // if there are incoming bytes available 
  // from the server, read them and print them:
   if (client.available()) {
     char c = client.read();    
     Serial.print(c);
   }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
     Serial.println();
     Serial.println("disconnecting.");
     client.stop();

     // do nothing forevermore:
     for(;;)     ;  
   }
 }

3 个答案:

答案 0 :(得分:3)

我弄明白了这个问题。作为新行的client.println()由于某种原因不起作用。所以,这是更新的代码

client.print("GET /checkcontrol.php HTTP/1.1\r\n");
client.print("Host: shahz.webatu.com\r\n");
client.print("User-Agent: arduino-ethernet\r\n");
client.print("Connection: close\r\n\r\n");

\r\n是为服务器添加新行以识别的正确方法。

答案 1 :(得分:0)

Host标头指定您要连接的网站的主机名。在这种情况下,您尝试连接到域kanishkaganguly.byethost5.com,但您的Host标头设置为www.arduino.cc。通常这是不正确的。 Host标头应与域匹配,因此两者都应为kanishkaganguly.byethost5.com

当客户端连接到域时,客户端首先将域名解析为IP,然后建立与该IP的连接。由于与IP建立了连接,因此服务器不知道客户端查找了哪个域名。由于IP是有限的资源,因此许多托管提供商在单个IP上托管多个域。如果没有Host标头,服务器将无法知道返回客户端的页面。

答案 2 :(得分:0)

println命令发送文本后跟&#34; \ r \ n&#34;因此,您可以将CRLF添加到关闭行,而不是更改每个println以进行打印。

Client.println(&#34; Connection:close \ r \ n&#34;)