- PR -

PDAからPCへのsocket通信遅延について

1
投稿者投稿内容
mino
会議室デビュー日: 2006/09/15
投稿数: 5
投稿日時: 2008-04-11 16:09
お世話になります。

[環境]
言語:VB.NET / Visual Studio 2005 / Windows XP

VB2005にて、PDA(クライアント)からPC(サーバ)へsocket通信を行うプログラムを作っています。
クライアントから"111"などの簡易な数値データを送り、瞬時にサーバーへデータを送りたいのですが、25秒たった後にサーバ側でクライアントからの接続を読み取ってしまいます。
PDA(クライアント)からPC(サーバ)へデータを瞬時に送る方法がございましたらご教授下さい。
25秒待たされるソース部分は下記します。

* PDAはWLANを使用していますが、約10Mbpsの通信を確保しています。
* PDAは .NET Compact Framework 2.0を使用し、PC側は.NET Framework 2.0を利用しています。

-----------------------------------
PDA側(クライアント)のソース
-----------------------------------

'文字コードを指定する
Dim enc As System.Text.Encoding = System.Text.Encoding.UTF8
'サーバーのホスト名とポート番号
Dim host As String = "xxx.xxx.xxx.xxx"
Dim port As Integer = 8000

'TcpClientを作成し、サーバーと接続する
Dim tcp As New System.Net.Sockets.TcpClient(host, port) '←ここで25秒待たされます
'NetworkStreamを取得する
Dim ns As System.Net.Sockets.NetworkStream = tcp.GetStream()

'サーバーにデータを送信する
'文字列をByte型配列に変換
Dim sendBytes As Byte() = enc.GetBytes("111")

'データを送信する
ns.Write(sendBytes, 0, sendBytes.Length)

'閉じる
tcp.Close()

-----------------------------------
vb初心者で行き詰ってしまい困っています。
ぜひよろしくお願いします。


[ メッセージ編集済み 編集者: mino 編集日時 2008-04-11 16:19 ]
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2008-04-11 16:22
サーバ側について一言も触れられていませんが、サーバは
何かプログラムで受信しているんでしょうか。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
mino
会議室デビュー日: 2006/09/15
投稿数: 5
投稿日時: 2008-04-11 16:40
ご返答有難うございました。
申し訳ございません。サーバー側もVB.NET(.NET Framework 2.0) を利用して作成しています。サーバー側のソースは下記のとおりです。

-----------------------------------
PC側(サーバー)のソース
-----------------------------------
'文字コードを指定する
Dim enc As System.Text.Encoding = System.Text.Encoding.UTF8
'ローカルIPアドレスでListenを開始する
Dim port As Integer = 8000
Dim listener As New System.Net.Sockets.TcpListener(port)
listener.Start()
Console.WriteLine(Dns.GetHostName() & " が Port{0}の Listen を開始しました。", port)

'接続要求があったら受け入れる
Dim tcp As System.Net.Sockets.TcpClient = listener.AcceptTcpClient()
Console.WriteLine("クライアントが接続しました。")
'NetworkStreamを取得
Dim ns As System.Net.Sockets.NetworkStream = tcp.GetStream()

'クライアントから送られたデータを受信する
Dim ms As New System.IO.MemoryStream
Dim resBytes(256) As Byte
Dim resSize As Integer

Do
  'データの一部を受信する
  resSize = ns.Read(resBytes, 0, resBytes.Length)
'Readが0を返した時はクライアントが切断したと判断

  If resSize = 0 Then
Console.WriteLine("クライアントが切断しました。")
Console.ReadLine()
Return
End If
'受信したデータを蓄積する
ms.Write(resBytes, 0, resSize)

Loop While ns.DataAvailable

'受信したデータを文字列に変換
Dim resMsg As String = enc.GetString(ms.ToArray())
ms.Close()

'PDA(クライアント)からのデータを表示
Console.WriteLine(resMsg)

'閉じる
tcp.Close()
Console.WriteLine("切断しました。")

'リスナを閉じる
listener.Stop()
Console.WriteLine("Listenerを閉じました。")
Console.ReadLine()



[ メッセージ編集済み 編集者: mino 編集日時 2008-04-11 16:46 ]
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2008-04-11 16:54
サーバー側は

引用:

'接続要求があったら受け入れる
Dim tcp As System.Net.Sockets.TcpClient = listener.AcceptTcpClient()



ここできちんと待っているのですよね?
で、
引用:

Dim host As String = "xxx.xxx.xxx.xxx"


IP指定で開いているので、DNS解決に時間がかかっているわけではない。
とするとTCP接続に時間がかかっているわけです。

順番に考えていけば、つぎに気にするのは
PDAのネットワークがきちんと初期化されているかどうか。
つぎに、WANを使っているということですから、
PDAとサーバーの間で初回だけ重い経路がないかどうか。
VPNであるとか、OnDemandな経路だと、初回に25秒はありえます。

そんなところでしょうか。
サーバー側も、PDA側も、突っ込みどころのあるプログラムですが、
25秒というのには関係ないと思います。
mino
会議室デビュー日: 2006/09/15
投稿数: 5
投稿日時: 2008-04-11 18:10
>PDAとサーバーの間で初回だけ重い経路がないかどうか。

PDA本体のネットワークの設定を調べなおした所、ネットワークアダプタ設定のデフォルトゲートウェイの指定を192.168.xx.240と特殊な指定にしていたのを192.168.xx.1に変更した所、データを瞬時に読取る事が出来ました。

本当に有難うございました。


[ メッセージ編集済み 編集者: mino 編集日時 2008-04-11 18:13 ]
1

スキルアップ/キャリアアップ(JOB@IT)