esp8266 Arduinoで tcpでデータを受信、処理するプログラムを作成していて、
送信が中断した場合に、状況を検出する方法がわからなかったので、調査した。
WebClient::status() メソッド
WebClientクラスの status()メソッドがlwIPの tcp_pcb構造体の state の値を返す。
stateの値は lwip/tcp.h で enum tcp_state で定義されている。
tcp.h
enum tcp_state {
CLOSED = 0,
LISTEN = 1,
SYN_SENT = 2,
SYN_RCVD = 3,
ESTABLISHED = 4,
FIN_WAIT_1 = 5,
FIN_WAIT_2 = 6,
CLOSE_WAIT = 7,
CLOSING = 8,
LAST_ACK = 9,
TIME_WAIT = 10
};
WebClient::status() ->CleintContext::state()->enum tcp_state
プログラム実行時のstate
の値
tcpでデータを受信するプログラムで、stateの値を表示させてみた所、
通常は 4: ESTABLISHEDで、送信を中断すると 0:CLOSEDに変化した。
closedかどうかを調べるだけであれば、 WebClient::connected()
の方が便利。
WebClient::operator bool
には注意
WebClient::operator bool
は connected()
を返すので、これを使ってもよさそうだ
... と思ったが、実際に使うと動作が変。
調べると、connected()が返るのは 2.4.1以降らしい。 2.4.0までは 以下のようになっている。
WiFiClient.cpp
WiFiClient::operator bool()
{
return _client != 0;
}
参考:(bool)WiFiClient needs to return ::connected() since ClientContext is… · esp8266/Arduino@a2e7c7d