【发布时间】:2011-09-15 14:14:18
【问题描述】:
我正在使用带有 Ethernet Shield 的 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来确定之前的连接是否已经关闭或正在逗留。 -
除上述之外,3)我会检查堆栈是否溢出。 4) 是否存在数千次循环后发生的内存泄漏。
-
服务器日志没有显示任何问题。使用 Arduinos 时内存总是一个问题,但上面的代码应该是相当“内存安全”的
-
你是如何从 tinker 下载库的?