
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も見ています
-
NetworkStreamからのRead()で、処理が止まる(C#)
C言語・C++・C#
-
System.Net.Sockets.SocketException が発生
Visual Basic(VBA)
-
ソケットの異常終了について
C言語・C++・C#
-
-
4
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
5
winsockでソケット通信の開発をしていますが、
C言語・C++・C#
-
6
Tomcatが無応答となる現象が起こります
Java
-
7
Designer.vbは直接コードをいじってはだめ?
Visual Basic(VBA)
-
8
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
9
WinSockでの通信プログラムがうまくいきません
C言語・C++・C#
-
10
【Hyper-Vの質問】ホストOS以外の物理端末からpingを飛ばしても応答がありません。
ネットワーク
-
11
VBでファイルが開かれているかどうかを確認したい
Visual Basic(VBA)
-
12
Form_Load と Form_Activate のタイミング
Visual Basic(VBA)
-
13
ListView 項目の選択/選択解除について
Visual Basic(VBA)
-
14
System.IO.Directory.GetFilesの順番
Visual Basic(VBA)
-
15
CSVファイルの中で、「 , 」カンマを使いたい
その他(コンピューター・テクノロジー)
-
16
DataGridViewの特定列に入力されている重複チェックをしたい
Visual Basic(VBA)
-
17
オブジェクト参照がオブジェクト インスタンスに設定されていません というエラーについて
Microsoft ASP
-
18
CloseとDisposeの違い
Visual Basic(VBA)
-
19
データベース関係で、データの洗い替えとはどのような事を行うことでしょう
IT・エンジニアリング
-
20
Visual Studio 「AnyCpu」について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UdpClient 送信元のIPアドレ...
-
C言語でHTTP1.1のキープアライ...
-
VB6‥ソケットについて
-
Socket通信の0バイト受信について
-
MFCソケットについて
-
vbでの232c接続プログラムについて
-
VB6のwinsockでconnectできない
-
ソケット通信
-
名前付きパイプの通信ポートに...
-
UDPで受信終了の合図を出して受...
-
ソケットを用いた1対多通信につ...
-
Winsockで接続待ちタイムアウト...
-
Macターミナルで実行中のプログ...
-
C# シリアル通信でデータ受信...
-
VB6.0 SHELLで起動...
-
シリアル通信の出力バッファと...
-
スーパーのレジで並んでいたら...
-
C言語で、メモリを解放しないで...
-
スロットゲームのプログラミング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信する時に、相手にどうや...
-
UDP通信におけるbind関数について
-
エクセル VBA でのCOMポート...
-
ソケットのクローズについて
-
ソケットのrecvの戻り値が0
-
VB6のwinsockでconnectできない
-
Socket通信の0バイト受信について
-
recv関数でフリーズしてしまう
-
Winsockで接続待ちタイムアウト...
-
Connectエラーが出てしまう・・...
-
送信したデータの一部が文字化...
-
【ajax】 XMLHttpRequestオブジ...
-
ソケット通信
-
closeされたsocketへの動作につ...
-
wsdlからのサービス化を行い。
-
Cにおける通信プログラミングの...
-
UdpClient 送信元のIPアドレ...
-
非ブロッキングソケットのrecv...
-
ソケットを用いた1対多通信につ...
おすすめ情報
> テストツールが改行無しの"OK"だけ返している可能性はないかな
可能性が高いため、真っ先に確認しました。
resSize = ns.Read(resBytes, 0, resBytes.Length);
の後に
string contents = Encoding.UTF8.GetString(resBytes);
として、contentsを確認しましたが、「OK¥n」を受信しているようです。
> タイムアウト前にテストツール側でセッションを閉じればReadからresSizeゼロで返って正常終了できる
その通りで、タイムアウト前にテストツール側を切断してしまえば、問題なくif (resSize == 0)に入り、正常終了しております。