我有一个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(;;) ;
}
}
答案 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;)