プログラムライブラリ
小さなプログラムです。
忘れないように置いてあります。
メニュー
- 用途
- プログラムの実行時間を計測するために作成しました。
2004/9/9 UP
- ファイル
-
リンク先にあるものです。
Winsock Programmer's FAQ: Basic Example Programs
ws-util.hとws-util.cpp
エラーコードの文章表示と、シャットダウン関数があります。
- 用途
- Winsockプログラミングは何かと面倒なため、後々参照できるように。
2004/9/12 UP
- ファイル
-
特にLIBファイルやDLLファイルの連結はいらないみたい(BCC32)
参考図書:WinSock2.0プログラミング Lewis Napper ソフトバンク
- 用途
- 書籍 「基礎からわかるTCP/IP ネットワーク実験プログラミング 村山公保著 オーム社」
P145 UDPクライアントプログラムのWindows移植版
- ファイル
-
(BCC32でコンパイル実行)
- その他
-
- 入力エラーチェックのたびにWSACleanup()を書くのが面倒だったため、WSADATAはクラスにした。
- サーバープログラムは移植予定無し。
- サーバープログラムが起動してないと、10054エラーになる。ブロッキングにはならない。
- 元プログラムは、クライアントsockaddr_inとソケットをbindしていたが、よくわからない。
- 学習用のため、表示コメントが多いです。
- 参考図書:「WinSock2.0プログラミング Lewis Napper ソフトバンク」
「基礎からわかるTCP/IP ネットワーク実験プログラミング 村山公保著 オーム社」
- 用途:学習用
- 書籍 「基礎からわかるTCP/IP ネットワーク実験プログラミング 村山公保著 オーム社」
TCPクライアントプログラムのWindows移植版
- ファイル
-
(BCC32でコンパイル実行)
- その他
-
- Linux版では、標準入力をselectで監視できるが、Windowsではできない。
- そのため、受信ループと送信ループを交互に繰り返すプログラムとなってしまった。
- 受信後、selectのタイムアウトで送信ルーチンに移動するようになっている。
- なんとかブロッキングモードで作ろうと思いました。
- 今後のWinsockプログラミングには、参考になるところはない。(反面教師)
- 非同期モードで作り直すつもりです。
- 用途:学習用
- 書籍 「基礎からわかるTCP/IP ネットワーク実験プログラミング 村山公保著 オーム社」
TCPクライアントプログラムのWindows移植版でイベントオブジェクト使用
- ファイル
-
(BCC32でコンパイル実行)
- その他
-
- 非同期モードはウインドウハンドルが必要だが、イベントオブジェクトではコンソールアプリが作れる。
- やはり標準入力を監視して、イベント分岐はできない。
- 自動応答するサーバー向けだと思った。
- 今回クライアントプログラムなので、ブロッキング&セレクトのようにタイムアウトを利用して標準入力を行っている。
- クライアントプログラムとしては今後の参考にならない。
- 標準I/Oを使うと標準入力の監視もできるらしいので作り直すつもりです。
- HTTPのGET接続は可能。FTPは接続できるが、PORT、PASVがよくわからない。メールは試していない。
- 用途:学習用
- 書籍 「基礎からわかるTCP/IP ネットワーク実験プログラミング 村山公保著 オーム社」
TCPクライアントプログラムのWindows移植版でイベントオブジェクト使用
上記プログラムを改良。エラーメッセージ表示に、ws_util.cpp の関数を使用している。
- ファイル
-
(BCC32でコンパイル実行)
- その他
-
- エラーコードを表示できるようにした。(ws_util.cpp使用)
- ws_util.cpp が必要。
- shutdown関数でWSAWOULDBLOCKのチェックをやめた。
- FD_CONNECTは、プログラムが起動して無くても、ポートが空いていればつながる感じ。
- その他は上のイベントオブジェクト使用のプログラムと一緒
- 用途:学習用
- 上記プログラムを改良。エラーメッセージ表示に、FormatMessage関数を使用している。
- ファイル
-
(BCC32でコンパイル実行)
- その他
-
- エラーメッセージにFormatMessage関数を使用した。
- ws_util.cpp ファイルがなくても単独で動作する。
- その他は上のイベントオブジェクト使用のプログラムと一緒
もう自分でもあきれるほど改訂だけど、将来のために残しておく。
ファイル
(BCC32でコンパイル実行)
改訂事項・メモ
- メインルーチンを、引数チェックルーチンと、通信ルーチンに分けた。
- サーバーからの切断は、FD_CLOSEを利用。recvの戻り値の0チェックでの判定はやめた。
- connectの後で、イベントオブジェクト、非ブロッキングソケットにした。
- connectではWSAEWOULDBLOCKはおこらない。はず。(接続できない場合、タイムアウトする。)
ようやく作ることが出来た。
ファイル
(BCC32でコンパイル実行)
改訂事項・メモ
- 本では、受信関数WSARecvをループ前と完了ルーチンに書いてあるが、ループの中に書いた。
- 本のように、SleepEx のタイムアウト時間を 0 にすると、WSAEWOULDBLOCK がたくさんくる。
- 受信文字をストリームに格納して、"TCP> "の文字列があったら、
標準入力から読み込みを待つようにした。
今までのも、こうすればよかったな。
ただし、TCPは1回の受信処理で1回の送信内容が受信できるとは限らないと書いてあったため、
"TCP> "が分割して受信されてもいいように、受信内容を全部 ostringstream に格納したが、
これがうまくいっているかは未確認。
- connect はブロッキング。重複I/Oだと WSARecv と WSASend しかつかえないのかな。
- WSARecv のエラーチェックと、受信バイト数で、接続切断を判断している。
- おおよそ本と同じ。
- 標準出力への出力は WriteFile 関数を同期で使った。
- イベントオブジェクトの方が簡単だとおもう。
その後のエラーデバッグ
- 受信バッファにはナル文字が終端にないので、文字列操作をすると余計なゴミが ostringstreamに入る。終端文字をつけるようにした。
- 必ずbuf[BUFSIZE+1] と1バイト余計に確保した方が、プログラム中で終端文字のスペースを考えなくていいので楽だ。
- バッファサイズを3など小さくして試すと、cin.getline が failbitをたてる。
cin.getlineで入力待ち状態にならないため、何も送信されずにコールバック関数を抜けて、SleepExで止まり続ける。
(sendで空文字を送信しているので、サーバーも改行コードを返す。)
そのため、必ず cin.clear() するようにした。
- help は「he」「lp」で送信される。
- サーバー側がコマンド文字列の分割受信に対応して無いので、コマンドが正しく送ることが出来ない。(おわらない)
今後の取り組み
- いろいろなサーバープログラムに対応できるようにしたい。
- 今は"TCP> "で、入力モードを待機しているので、ここを何とかしないといけない。
- FTP、HTTP、SMTPくらいには対応したい。
- 最近FFFTPでGeositiesのFTPに接続できなかったことがある。(サーバーの入れ替え、DNS名前解決のミス)ホスト名で接続失敗した場合はIPアドレスのエイリアスも使うようにしないといけないかな。
注意点などです。
Geocitiesに置けるファイル形式の都合上、ファイル名の最後に「.txt」をつけて、テキストファイルにしてアップロードしています。(timer.h.txtなどとなります。)
ダウンロードすると、改行コードがLFのままになっているかもしれません。
ミスも多いと思いますが、使用、改変、再配布などご自由にどうぞ。
他の方の著作権にも気をつけているつもりですが、落ち度がありましたらご連絡お願いいたします。
免責事項です。
うまく動作しない場合もあるかもしれません。
ソースコードや実行ファイルの使用および不使用によって生じたいかなる損害についても作者は責任を負いません。
実行環境です。
WindowsXPまたはWindows2000
たいてい、ボーランドのフリーのコンパイラBCCでコンパイル実行させています。(BCC32 ver5.5かな)
マイクロソフトのVisualStudio2003Professionalを使用していることもあります。 (MFCなど)
Copyright © 2004 すなやま All rights reserved.
このページの先頭に戻る