Winsockでファイルを送受信するには?

解決


Sigma  2004-05-29 01:17:49  No: 83650  IP: [192.*.*.*]

こちらの掲示板の過去ログを拝見して、Winsockを使用してファイルを送受信するコードを書いてみたのですが、

Dim sd() As Byte
Dim fn As Integer

fn = FreeFile()

Open "C:\a.mp3" For Binary Access Read As fn
ReDim sd(0 To LOF(fn) - 1)
Get fn, , sd()
Close fn

Winsock.SendData sd()

送信部分はこんな感じになりました。
受信部分は、どのようにすればいいのでしょうか?
Putを使ったりしてみたのですが、どうもうまくいかなくて・・・。
よろしくお願いします。

編集 削除
のん  2004-05-29 09:48:53  No: 83651  IP: [192.*.*.*]

>送信部分はこんな感じになりました。
TCPで送信したいのでしょうか、それともUDP?
ソースの記述を端折っているのだと思いますが、それでは送信できません。

>Putを使ったりしてみたのですが、どうもうまくいかなくて・・・。

どういう意味でしょうか?
受信はできているけどファイルにうまく書き出せないということでしょうか?

MSDNでWinsockコントロールの使い方という項目があります。
そこにサーバー側、クライアント側ともにサンプルコードがありますので
参照してみてください。

編集 削除
Sigma  2004-05-29 11:06:24  No: 83652  IP: [192.*.*.*]

レスどうもです。
プロトコルはTCPです。TCPでのテキストのやり取り(要するにチャット)はうまくいきます。
おっしゃる通り、受信はできているが、ファイルにうまく書き出せない、ということです。
ファイルは生成されるのですが、ファイルの末端部64KBしか書き出せません・・・。

'受信部
Dim gd() As Byte

WS.GetData gd()

fn = FreeFile()

Open "D:\a.mp3" For Binary Access Write As fn
Print fn, gd()
Close fn

編集 削除
のん  2004-05-29 11:50:31  No: 83653  IP: [192.*.*.*]

なんとなく分かりました。
受信イベント時にそのつどファイルをバイナリモードでオープンして
書き足しているわけですね。
バイナリモードでファイルを開いた場合書き込み位置は常にファイルの先頭にあります。
つまり、ファイルをオープンした後、ファイル書き込み位置をファイルの
最後まで移動させてやる必要があります。
LOF関数やSeekステートメントを調べて見てください。

編集 削除
のん  2004-05-29 11:51:51  No: 83654  IP: [192.*.*.*]

ちなみにPutでいけますよ。

編集 削除
のん  2004-05-29 12:00:57  No: 83655  IP: [192.*.*.*]

さらに蛇足ですが
ConnectionRequestイベントでファイルをオープンして、Closeイベント
またはErrorイベントでファイルを閉じてやれば上記のような処理はいら
ないと思います。

編集 削除
Sigma  2004-05-29 13:12:43  No: 83656  IP: [192.*.*.*]

レスどうもです。
ご指摘の通り色々調べてみて、Openステートメントの下に

Seek fn, LOF(fn) + 1

を追加してやることで、何なくファイル受信できるようになりました。
ありがとうございました。

編集 削除