TCPのポート番号って、自分のシステム内部でしか使わないサーバーでは どのポート番号を使えばいいのか、いまいち分からないなー。
ま、HTTPのデフォルトが80ということだけはたぶん間違いないだろう(笑)
TCPのポート番号って、自分のシステム内部でしか使わないサーバーでは どのポート番号を使えばいいのか、いまいち分からないなー。
ま、HTTPのデフォルトが80ということだけはたぶん間違いないだろう(笑)
ソケット通信のshutdown()では、送信・受信のいずれをシャットダウンするかを指定する。
UNIXではSHUT_RD・SHUT_WR・SHUT_RDWRだというのは知っていたんだけど、WinSockでのマクロは知らなかった。
んだけど、それがSD_RECEIVE・SD_SEND・SD_BOTHだというのを今日知った。
つーか、関数名はほとんど全く同じなのに、なんでこういうマクロだけ違う名称になってるんだ(苦笑)
winsockを使って通信をするサンプルを作る為に自分のウェブページのソースをコピペしてみたら、コンパイルエラーになる部分があったので修正。
(rmaskの「r」が全角文字になってたとか、soc+1はキャストが必要とか、インクルードするヘッダーはwinsock.hじゃなくてwinsock2.hの方がいいとか(爆))
ところで、今回はこれをDLL化しようとしたんだけど、winsockの場合は他の言語のライブラリと違って最初に一回だけWSAStartupで初期化し、最後にWSACleanupでクリーンアップしなければならない。
DLLの場合、ロード時や終了時にDllMainが呼ばれ、その第二引数の値によって どの時点で呼ばれたかが分かる。
なので、DLL_PROCESS_ATTACHで呼ばれたときにWSAStartupし、DLL_PROCESS_DETACHで呼ばれたらWSACleanupをすればちょうどいいじゃん!
と思ったんだけど。
マイクロソフトのSDKのページや.NETとの混在DLLのページにある制限事項を見ると、DllMainでは別DLLをロードしたり解放したりするようなことは禁止であり、問題が発生しうる例としてソケット関数呼び出しがバッチリ挙げられていた(泣)
自分で試した限りではとりあえず動いたし、DllMainでWSAStartupを呼び出している例もウェブ上で見かけたが…いいんだろうか。WSAStartupがDLLをロードしていなければたぶん大丈夫だと思うけど、どうなんだろう?
(たぶん、「絶対ロードしない」とは言い切れないだろうな~)
なんとなく自分のTCP/IPのメモを見ていたら、おかしなところを発見。
ソケットをクローズするときに「リスニングソケットがFINを投げる」と書いてあるが、これは「接続済ソケット」の間違いでしょ(汗)
リスニングソケットは接続を待ってるだけなんだから、誰に対してFINを投げるっちゅーねん!
なにげなく自分の書いたソケット通信のメモを見ていたら、ちょっと間違いを発見。
クライアントからのconnectは、サーバーがlistenしてさえいれば、acceptしなくても成功するんだよねー。
あと、ブロッキングについてのメモを追加。
その他、語尾とか曖昧な表現とか気になったところをちょびちょび修正。