
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で質問しましょう!
似たような質問が見つかりました
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- C言語・C++・C# 現在プログラムを作っているのですが、実行したときに写真のように結果が表示されるのですが、これを CH 2 2023/01/18 16:22
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- オープンソース AWSドメイン名でApacheテスト・ページを表示させる方法を教えて下さい。 1 2023/04/26 15:59
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
この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
Tomcatが無応答となる現象が起こります
Java
-
6
CloseとDisposeの違い
Visual Basic(VBA)
-
7
System.IO.Directory.GetFilesの順番
Visual Basic(VBA)
-
8
PINGが通るのにネットワークに繋がらない
SSL・HTTPS
-
9
WinSockでの通信プログラムがうまくいきません
C言語・C++・C#
-
10
ListView 項目の選択/選択解除について
Visual Basic(VBA)
-
11
VBでファイルが開かれているかどうかを確認したい
Visual Basic(VBA)
-
12
VBで構造体の配列を関数に渡す方法?
Visual Basic(VBA)
-
13
オブジェクト参照がオブジェクト インスタンスに設定されていません というエラーについて
Microsoft ASP
-
14
SQL*Plusの終了はquit?exit?
Oracle
-
15
フルパスから最後のディレクトリ名を取得したい。
Visual Basic(VBA)
-
16
winsockでソケット通信の開発をしていますが、
C言語・C++・C#
-
17
C# 配列の変数宣言について。
C言語・C++・C#
-
18
.NETアプリを作ったときの .manifest ファイルって必要なの
C言語・C++・C#
-
19
【ASP.NET】 独自で作成したクラスが認識されない
その他(プログラミング・Web制作)
-
20
データベースのINT型項目にNULLはNG?
MySQL
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UDP通信する時に、相手にどうや...
-
TCP/IP通信時のサーバーからの受信
-
エクセル VBA でのCOMポート...
-
UDP通信(SNMP)したいが、うま...
-
Winsockで接続待ちタイムアウト...
-
ソケットでクライアントのipア...
-
Socket通信の0バイト受信について
-
相手のIPアドレスを取得する方法
-
C言語でHTTP1.1のキープアライ...
-
ソケットを用いた1対多通信につ...
-
closeされたsocketへの動作につ...
-
VB6のwinsockでconnectできない
-
ソケットのrecvの戻り値が0
-
UdpClient 送信元のIPアドレ...
-
recv関数でフリーズしてしまう
-
TCP/IPプログラミング
-
MFCソケットについて
-
Android Socket.connectエラー
-
SIPがNATを越えられない理由
-
UDP通信におけるbind関数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信する時に、相手にどうや...
-
エクセル VBA でのCOMポート...
-
UDP通信におけるbind関数について
-
Winsockで接続待ちタイムアウト...
-
VB6のwinsockでconnectできない
-
ソケットのクローズについて
-
Connectエラーが出てしまう・・...
-
ソケットのrecvの戻り値が0
-
recv関数でフリーズしてしまう
-
CreateFile関数でCOMポートが開...
-
WinSockでの通信プログラムがう...
-
Socket通信の0バイト受信について
-
ソケット通信 同じポート番号...
-
空きポートの取得方法
-
MFCソケットについて
-
送信したデータの一部が文字化...
-
closeされたsocketへの動作につ...
-
ネットワークプログラミングに...
-
非ブロッキングソケットのrecv...
おすすめ情報
> テストツールが改行無しの"OK"だけ返している可能性はないかな
可能性が高いため、真っ先に確認しました。
resSize = ns.Read(resBytes, 0, resBytes.Length);
の後に
string contents = Encoding.UTF8.GetString(resBytes);
として、contentsを確認しましたが、「OK¥n」を受信しているようです。
> タイムアウト前にテストツール側でセッションを閉じればReadからresSizeゼロで返って正常終了できる
その通りで、タイムアウト前にテストツール側を切断してしまえば、問題なくif (resSize == 0)に入り、正常終了しております。