我正在使用具有以太網屏蔽的Arduino Uno。許多客戶端打印後Arduino(Uno)以太網客戶端連接失敗
發送很多HTTP請求後,client.println(...),連接時客戶端開始失敗。失敗的時間似乎是隨機的,循環中的序列讀數可以在〜1000和〜7000之間任意變化。
的錯誤不是做與以太網發送緩衝區溢出(以下this advice)
這裏是一個錯誤的代碼:
#include <Ethernet.h>
#include <SPI.h>
// Network constants
byte mac[] = {0x00, 0x23, 0xdf, 0x82, 0xd4, 0x01};
byte ip[] = {/*REDACTED*/};
byte server[] = {/*REDACTED*/};
int port = /*REDACTED*/;
Client client(server, port);
// State
int sequence;
void setup(){
Ethernet.begin(mac, ip);
Serial.begin(9600);
sequence = 0;
delay(1000);
}
void loop(){
httpPut("/topic/:test/publish?sessionId=SESenanhygrp");
Serial.println(sequence++);
}
void httpPut(char* url){
if (!client.connect()) {
Serial.println("EXCEPTION: during HTTP PUT. Could not connect");
return;
}
client.print("PUT");
client.print(" ");
client.print(url);
client.println(" HTTP/1.0");
client.println();
while(!client.available()){
delay(1);
}
while(client.available()) {
char c = client.read();
Serial.print(c);
}
while(client.connected()){
Serial.println("Waiting for server to disconnect");
}
client.stop();
}
在以下段將出現錯誤
if (!client.connect()) {
Serial.println("EXCEPTION: during HTTP PUT. Could not connect");
return;
}
在客戶端連接失敗的時候,我會做兩件事:(1)檢查服務器日誌中是否有任何證據服務器接收失敗的連接請求; (2)在服務器上使用'netstat'來確定之前的連接是否已經關閉或者正在等待。 – NPE
除上述之外,3)我會檢查堆棧是否溢出。 4)數千個週期後是否發生內存泄漏。 – Jeff
服務器日誌沒有顯示任何問題。使用Arduinos時內存始終是一個問題,但上面的代碼應該是'內存安全' – ChrisSSocha