LoginSignup
0
0

More than 5 years have passed since last update.

esp8266 Arduino の WebClient::status()の値

Last updated at Posted at 2018-07-02

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 boolconnected()を返すので、これを使ってもよさそうだ
... と思ったが、実際に使うと動作が変。 

調べると、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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0