SSブログ

ソケット通信のプログラムを書いていて思ったことのメモ書き [プログラム]

久しぶりにTCP/IPのプログラムを書いていて考えたこと。

BSDソケットを使用する場合は、ioctl(winsock:ioctlsocket)で
非同期(FIONBIO:1)にして、タイムアウト付きでselectすれば、
プロセスが死んだときにブロッキングしたまま死ぬことは、
取りあえず、避けられる。
スレッドを使用したプログラムなんかだと、何かのタイミングで
通信を終了したい場合にこの方法が有効かと思う。
※ スレットの終わり方は、基本的に他殺ではなくて、自滅だと思うので・・・

winsockでも、スレッドを作って↑の方法で行うのも可能。
しかし、winsockの場合、selectは非推奨らしい。
WSAAsyncSelect(or WSAEventSelect)を使って欲しいらしい。

WSAEventSelectを使用する場合でも、WSACreateEvenとWSAEventSelectして、
WSAWaitForMultipleEventsで待て、WSAEnumNetworkEventsでイベント要因を
取得すればいいだけだから、まあ、ちょっと手間だけどselectと同じ使い方が出来ると思う。
関係ないけど、WSACreateEvenしたら、WSACloseEventしないといけないな。
※ 実際にWSAEventSelectを使用したプログラムを作成したことは、無いけど・・・ 

ちょっと気になったのが、WSAAsyncSelect。
hWndをパラメータに渡してあげなければいけない。
まあ、普通にVC++(MFC)の時は、CDialogかCMainFrameなどのm_hWnd、
Win32APIの時は、CreateWindowなどのHWNDを渡せば良い話なのだが。
(機能や目的別にクラスの構成を考えた時)ソケット通信を行うクラスでも、
ウィンドウを作成しなければいけなくなってしまう。
なんか、通信することが目的なのに、ウィンドウを作成しなけばいけいことに、
なんか、もやもやとしたものが心に残る。
(まあ、通信ログを表示するウィンドウを作成すると考えればいいのだけど。 非表示でも、いいんだし・・・。
 でも、しっくりこない)
オブジェクト指向をもっと勉強すれば、しっくりくる方法があるのかな。

あと気になるのが、acceptして、forkして、子プロセスでrecvなり、sendなりすること。
仮に、チームもしくは、会社のコーディング規則でオブジェクトの動的生成が駄目な場合、
どうすればいいのだろう。まあ、そうなると、予めスレッドを作成して、
スレッド間通信でソケットのfd(ハンドル?)をやり取りするのかな。
(今のところ、オブジェクトの動的生成NGと言われたことはないけど)


タグ:prog
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0



この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。