接続を開始する前に、リモート ホストにデータを送信することはできません。それはまったく意味がありません。私の質問は、デバイスをリモート ホストに接続するか、それともリモート ホストがデバイスへの接続を開始するかです。
現在、デバイスで netconn_accept を使用しています。つまり、デバイスがリモート ホストに信号を送る前に、リモート ホストがデバイスへの接続を開始するのを待っているということです。これは、あなたが書いたコードの完全に予想される動作ですが、これについて心配しているようです. これはあなたの意図ではありませんか?そうでない場合、なぜそのようにコーディングしたのですか?もう 1 つの方法は、デバイスがリモート ホストへの接続を開始するようにすることです。netconns hereの使用例があります。もちろん、これにはシステム内の他のデバイスへの変更も含まれます。
したがって、その話の教訓は、接続が存在しない場合はデータを送信できず、データを送信する前に接続を待機しているということです。接続を待ちたくないので、相手側が接続を開始するのを待つのではなく、接続を開始するようにソフトウェアを変更する必要があります。
遭遇するかもしれないもう 1 つの問題は、同じ接続で同時にデータを送受信できるようにしたいということです。lwip で見たほとんどの例では、データを待機している呼び出しをブロックし、そのデータに応答して何かを送り返しています。何かを最初に受信せずに、何かを送り返したい場合があります。私もそれを手伝うことができます。
これは、リスニング netconn 接続を作成したときにうまくいったことです。
まず、次のように設定してタイムアウトを有効にする必要があります。
#LWIP_SO_RCVTIMEO 1 の定義
次に、これと同様に netconn を設定する必要があります。
pxTCPListener = netconn_new (NETCONN_TCP);
netconn_bind (pxTCPListener、NULL、23);
netconn_listen (pxTCPListener);
pxNewConnection = netconn_accept (pxTCPListener); //これは、接続が受け入れられるまでブロックします
//これが重要な行です!
pxNewConnection->recv_timeout = 10; //注 これはミリ秒です - lwip はミリ秒単位で動作します
//これは、接続が閉じられるまでループします
while(!ERR_IS_FATAL(pxNewConnection->err)) { //致命的なエラーには、接続のクローズ、リセット、中止などが含まれます
//この netconn_recv 呼び出しは、新しいデータを 10 ミリ秒待ってから戻ります
if ((pxRxBuffer = netconn_recv (pxNewConnection)) != NULL) {
//受信データの処理
}
//ここで、必要な送信を行います
} // 上記の while ループの終了
このコードにより、ブロッキングを気にせずに送受信を同時に行うことができます。