
TCP/IP通信のクライアントプログラムをVC#で作成しております。
のん様が配布されているTCP/IPテストツール↓をサーバー側として、テスト通信しております。
http://www.vector.co.jp/soft/dl/winnt/net/se4112 …
クライアントプログラムからテストツールにコマンド送信できていることは確認いたしました。
ただ、テストツールから「OK\n」をTEXT送信をした後、doループ処理から抜けられず、強制終了してしまいます。
強制終了時に表示されるメッセージは以下の通りとなります。
-----
System.IO.IOException: 転送接続からデータを読み取れません: 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。。 ---> System.Net.Sockets.SocketException: 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。
場所 System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
場所 System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
--- 内部例外スタック トレースの終わり ---
場所 System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
:
-----
doループ処理の終了条件(NetworkStreamに読み取り対象のデータがない、もしくは受信したデータの終端が\n)が満たされないまま、タイムアウトしてしまっているのだと思います。
質問:どのように修正すれば、想定している動作(クライアントプログラムからテストツールにコマンド送信、テストツールからOK\nを受信して終了)になるか、ご教示いただけませんでしょうか?
よろしくお願いいたします。
-----クライアントプログラムのソースコード抜粋
private void Send(string data){
TcpClient tcp = new TcpClient(txt_IP.Text, int.Parse(txt_Port.Text));
NetworkStream ns = tcp.GetStream();
ns.ReadTimeout = 5000;
ns.WriteTimeout = 5000;
byte[] sendBytes = Encoding.UTF8.GetBytes(data + "\n");
ns.Write(sendBytes, 0, sendBytes.Length); // ←コマンド送信はできている
MemoryStream ms = new MemoryStream();
byte[] resBytes = new byte[256];
int resSize = 0;
do {
resSize = ns.Read(resBytes, 0, resBytes.Length);
if (resSize == 0) {
break;
}
ms.Write(resBytes, 0, resSize);
} while (ns.DataAvailable || resBytes[resSize - 1] != '\n'); // ←ここから抜けられない
string resMsg = Encoding.UTF8.GetString(ms.GetBuffer(), 0, (int)ms.Length);
ms.Close();
resMsg = resMsg.TrimEnd('\n');
ns.Close();
tcp.Close();
}
No.1ベストアンサー
- 回答日時:
テストツールが改行無しの"OK"だけ返している可能性はないかな。
コード的には続く改行を待ってタイムアウトしそう。タイムアウトしたら例外を返すはずなので例外処理しておかないとプログラムは強制終了する。タイムアウト前にテストツール側でセッションを閉じればReadからresSizeゼロで返って正常終了できるかもだけど。
とりあえず実際にネットワークを流れるパケットがどうなっているか確認するのが肝でしょう。ネットワークをモニタできるツールを入れて確認すれば?
あとはReadから返ったところでprint文でも書いてどこまで受信できているか確認するとか。
No.2
- 回答日時:
(1) テストツール側に開発プログラムから受信したデータと返信したデータをダンプする機能をそれぞれ適切な場所へ入れる。
(2) 開発プログラムの「サーバとの接続成功」、「サーバーへの送信成功」、「サーバーからの受信成功」のことろにメッセージ出力を入れて進み具合を目視確認できるようにする。
ちなみに(2)はコンパイルオプションで機能のON/OFFが出来るようにしておくと便利です。
で、「サーバーからの受信成功」のメッセージ表示がされないのであればテストツール側の問題。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
[C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について
C言語・C++・C#
-
C++アンインストールの影響
C言語・C++・C#
-
C言語について。
C言語・C++・C#
-
4
c言語で自然数nを入力、2以上n以下の偶数の累積sumを求めるプログラムをfor文を使って作りたいで
C言語・C++・C#
-
5
PCの性能とビルド時間
C言語・C++・C#
-
6
C言語の質問です、プログラミング初心者です このような文字列があった場合 abcdef☆ghijk"
C言語・C++・C#
-
7
C言語について。
C言語・C++・C#
-
8
C言語 少しの疑問
C言語・C++・C#
-
9
【プログラミング】制限なし部分和の配列の処理について
C言語・C++・C#
-
10
c言語について array[i]-‘0’ これってどーゆー意味ですか? (ちなみに16進数を10進数
C言語・C++・C#
-
11
C言語で構造体の参照渡しができません
C言語・C++・C#
-
12
参考にいろいろとc言語、c++言語プログラミングでレジストリーを操作したいのですが、無料配布のc++
C言語・C++・C#
-
13
C言語 コマンドプロンプトについて。
C言語・C++・C#
-
14
プログラム例え話について。
C言語・C++・C#
-
15
C++はWindows運用に必須なのか
C言語・C++・C#
-
16
C言語について教えて欲しいです。 ファイルの中身をコピーするプログラムを作ってます aというファイル
C言語・C++・C#
-
17
C++言語の16進数の表現についておしえてください
C言語・C++・C#
-
18
アクセス権の組み合わせについて 読み込み:4、書き込み:2、実行:1 と言う風に設定されているので、
C言語・C++・C#
-
19
ある線が円の範囲に入っているかの計算
C言語・C++・C#
-
20
gcc のコンパイラオプションについて
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
ソケットのクローズについて
-
5
CreateFile関数でCOMポートが開...
-
6
VB6のwinsockでconnectできない
-
7
ソケットのrecvの戻り値が0
-
8
SIPがNATを越えられない理由
-
9
TCP/IPプログラミングでのselec...
-
10
VB6‥ソケットについて
-
11
WinSockでの通信プログラムがう...
-
12
Connectエラーが出てしまう・・...
-
13
ポート番号0について
-
14
Socket通信の0バイト受信について
-
15
recv関数でフリーズしてしまう
-
16
winsockでファイル転送
-
17
サーバーソケットを開いたまま...
-
18
相手のIPアドレスを取得する方法
-
19
TCP/IP通信について
-
20
POP3S
おすすめ情報
公式facebook
公式twitter
> テストツールが改行無しの"OK"だけ返している可能性はないかな
可能性が高いため、真っ先に確認しました。
resSize = ns.Read(resBytes, 0, resBytes.Length);
の後に
string contents = Encoding.UTF8.GetString(resBytes);
として、contentsを確認しましたが、「OK¥n」を受信しているようです。
> タイムアウト前にテストツール側でセッションを閉じればReadからresSizeゼロで返って正常終了できる
その通りで、タイムアウト前にテストツール側を切断してしまえば、問題なくif (resSize == 0)に入り、正常終了しております。