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

解決


Sigma  2004-05-29 10:17:49  No: 83650

こちらの掲示板の過去ログを拝見して、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 18:48:53  No: 83651

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

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

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

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


Sigma  2004-05-29 20:06:24  No: 83652

レスどうもです。
プロトコルは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 20:50:31  No: 83653

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


のん  2004-05-29 20:51:51  No: 83654

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


のん  2004-05-29 21:00:57  No: 83655

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


Sigma  2004-05-29 22:12:43  No: 83656

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

Seek fn, LOF(fn) + 1

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加