2016/01/16

[linux]socketの送受信を非同期にしたい (2)

前回は、オープンしたsocketをpoll()したままwrite()できるの?という疑問提起だけで終わっていた。
我ながら「最後までやってから書けよ」と思ったけど、力尽きたのだ。

やってみたが、普通にできた。
まあ、そりゃそうか。
Live Writeのプラグイン機能がまだ使えないのでソースは載せられないが、だいたいこういうことをやった。

  • socket()する
  • connect()でサーバと接続する
  • pthread_create()してスレッドにソケットのディスクリプタを渡す
  • ワーキングスレッド側で、poll()する(POLLIN)
  • メインスレッド側で、write()する

送れたし、受信もできた。
なーんだ。


それっぽくロジックだけ抜き出して送受信して動いていたのだが、ESP8266でちょっと期待と違う動きをすることがあった。
私の期待と違っただけで、よく考えると「そう作っておけよ」というところなのだが。

何かというと、受信完了コールバックが呼ばれたとき、データに2パケット分のデータが入っていたのだ。
2回呼ばれると思っていたから、1回分の受信処理しかやってなくて、1つ飛ばしてしまうという現象があったのだ。
なかなか気付かなくてねぇ。

もう1つ確信が持てないままなのが、送信だ。
送信完了コールバックが返ってくる前に送信すると、うまくいかなかったような気がしたのだ。
送信バッファを持ってないのかと思ったけど、struct espconn_packetを見ると持っていても悪くなさそうな感じもしている。
ここは、要調査ですな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。