2016/01/15

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

したいのだが、よくわかってないので今回は準備編だ。

 

ESP8266で処理を作ろうとしたけど、デバッグがめんどくさい。
いっそのこと、socketで作った後、ロジックだけ移植できんだろうかと考えている。
あわよくば、別の環境に持って行きやすくなるだろうし。

あまりsocket通信はやったことないのだけど、プロセス間通信でやるときは送信用と受信用のsocketをそれぞれ開いて、受信用は別スレッドにしてpoll()とかで待たせる、みたいな感じでやっていた。
socketpairとか、そんな感じよね。

でも、外部と通信するとなると、ソケットってけっこう大切な資源というか、「このポートで通信しましょう」という感じでやるから、私の都合で送受信のポートを作るわけにいかない。
となると、1本のsocketで送信も受信もやることになりそうだ。

ESP8266は、送信要求して送信完了コールバックが呼ばれるし、受信したら受信コールバックが呼ばれる(受信完了なのかな?)。
同じようにやりたいなら、送信用のスレッドと受信用のスレッドを用意。
送信データを詰めて送信用スレッドに渡してwrite()し、write()が終わったらコールバック。あるいは、送信可能になったらコールバック。
受信スレッドはpoll()でPOLLINして待って、受信データが来たら全部バッファにためて、全部吸い上げたらコールバック。
そんな感じか?

でも、poll()してるsocket番号にwrite()できるのかいな?
read()してるわけじゃないし、POLLOUTも指定できるくらいだからやれそうな気もする。

 

知ってる人からすると「そんなの当たり前やん」なことかもしれんが、慣れてない人はそういうのがわからんのだ!と力強く主張してみた。
結果は、次回。

0 件のコメント:

コメントを投稿

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

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