Tôi đang sử dụng Arduino Uno với Ethernet Shield.Kết nối máy khách Ethernet (Uno) không thành công sau khi nhiều máy khách in
Sau khi gửi nhiều yêu cầu HTTP, client.println (...), khách hàng bắt đầu không thành công khi kết nối. Thời gian để thất bại dường như là ngẫu nhiên, và đọc chuỗi từ vòng lặp có thể thay đổi bất cứ nơi nào giữa ~ 1000 và ~ 7000.
Các lỗi không phải là để làm với Ethernet Transmit Buffer tràn (Sau this advice)
Đây là mã được không:
#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();
}
Lỗi này xảy ra trong phân khúc sau
if (!client.connect()) {
Serial.println("EXCEPTION: during HTTP PUT. Could not connect");
return;
}
Tại thời điểm khách hàng không kết nối được, tôi sẽ làm hai việc: (1) kiểm tra nhật ký máy chủ để tìm bất kỳ bằng chứng nào của máy chủ nhận được yêu cầu kết nối không thành công; (2) sử dụng 'netstat' trên máy chủ để xác định liệu các kết nối trước đó đã bị đóng hay đang kéo dài. – NPE
Ngoài việc ở trên, 3) Tôi sẽ kiểm tra xem ngăn xếp có tràn không. 4) Có rò rỉ bộ nhớ xảy ra sau hàng nghìn chu kỳ. – Jeff
Nhật ký máy chủ không cho biết bất kỳ sự cố nào. Bộ nhớ luôn là một vấn đề khi sử dụng Arduinos, nhưng đoạn mã trên phải khá 'an toàn bộ nhớ' – ChrisSSocha