Winsockについて勉強中なのですが、ファイルを送信すると8KBまでしか受信できません。おそらくサーバー側の問題だと思いますが...(TT)
_/_/_/_/_/_/_/_/_/_/_/_/クライアント_/_/_/_/_/_/_/_/_/_/_/_/
Private Sub Command1_Click()
Dim GetFileByte() As Byte
CommonDialog1.Filter = "全てのファイル|*.*"
On Error GoTo error
CommonDialog1.ShowOpen
On Error GoTo 0
FileName = CommonDialog1.FileName
FileNumber = FreeFile()
Open FileName For Binary As #FileNumber
fileB = LOF(FileNumber)
ReDim GetFileByte(1 To fileB)
Get #FileNumber, , GetFileByte()
Close #FileNumber
If Winsock1.State = 7 Then
ProgressBar1.Max = fileB
For i = 1 To fileB
Winsock1.SendData (GetFileByte(i))
ProgressBar1.Value = i
Next i
End If
error:
End Sub
_/_/_/_/_/_/_/_/_/_/_/_/サーバー_/_/_/_/_/_/_/_/_/_/_/_/
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
fileb = bytesTotal
Dim pickdat() As Byte
ReDim pickdat(1 To fileb)
Winsock1.GetData pickdat(), vbArray + vbByte
On Error GoTo error
CommonDialog1.ShowSave
On Error GoTo 0
FileName = CommonDialog1.FileName
FileNumber = FreeFile()
Open FileName For Binary As #FileNumber
Put #FileNumber, , pickdat()
Close #filenum
error:
End Sub
以上です。例えば8KB以下のファイルだと普通に画像なり音楽なり受信して
ファイルに保存が出来るのですが。以上だと受信側で保存のダイアログが
(ファイルサイズ / 8)回開きます。何が原因でしょうか?
お願いします。
うーん、原因はいろいろとありますが、
クライアント、サーバーともに問題があります。
1.クライアントは相手の受信バッファの限界を無視して
データを送り続けている
2.サーバーはデータが到達する度にファイルをオープンしている
とりあえずこの 2点ですかね。
見た感じではTCPのようですが、
全体の流れとして、
A.クライアントは全データを一気に送ろうとする
(相手を無視してFor文で送り続ける)
B.サーバーはバッファサイズ(多分8KB)だけ受け取る。
データはまだ来るようだが、受け取る場所が無いので
クライアントを待たせる
C.クライアントは続けてまだ受け取られていないデータを再送しようとするが
サーバーに待たされる
D.サーバーはファイルを開き、今受け取ったデータをファイルに保存し、ファイルを閉じ、続きを受け取る
B.C.D.を必要回数繰り返す
E.終了
という流れです。
ご返信ありがとうございます。
教えていただいた点について出来る限り改善をいたしました結果、
考え方がわかってきました。改善した点は、
・クライアント側でGetFileByte()配列を1 to 7000位に抑え
For文でファイルサイズ分回して、動的配列でちょっとずつ読みこませる。
・CommonDialog1.ShowSaveを使わずに実行ファイルと同じ場所に作成
大きくは大体そのくらいです。mp3送ったら途切れ途切れで(TT)
まだ調整が必要みたいです。テストなんで仕方ないですけど・・・
でも8KB以上再生できたときはなかなか感動でした W^-^W
Loreleyさんありがとうございました。
ファイルを送信するなんて専用のコントロールがあるのかと思っていました。^^W BinaryとかFTPソフトとかでしかみたこと無かったですし・・・
おっとっと、解決忘れてた・・・
おやくにたてたようでなによりです(^^)
追記で気をつけたいポイントをひとつ
>GetFileByte()配列を1 to 7000位
とありますが、
最後の一回の送信を気をつけてください
たとえば36000Byteのファイルを7000の配列で送るとき、
最後の一回は1000Byteですよね。
それを間違って7000Byte送るとおかしくなります
それと、mp3を送っているようですが、
最初はテキストファイルで
GetFileByte()配列を1 to 70位に抑えて
(というのもテキストで大きいサイズのファイルを探すのが大変ですから)
送信すると(もちろんByte型で送信)
受け取った側でそのテキストをメモ帳で開いてみれば、
どのへんがおかしいのかが多少わかりやすくなりますよ
(つなぎ目がおかしい、ファイルサイズがおかしい、
書き込んだデータそのものがおかしい etc..)
ご参考までに。
ツイート | ![]() |