Winsockでバイナリファイルを正しく転送するには?


しき  2003-04-18 18:33:50  No: 106746

Winsockコントロールを使用し
ネットワーク間でのバイナリファイルのやり取りをしたいと思っていますが
最初の1バイトのみ受信し、2バイト目以降のデータに関しては
受信しないまま転送が終わってしまいます。
何か問題がござしましたらご指摘お願いいたします
なおWinsockのプロトコルはTCP/IPを使用しています

送信側:
Private Sub send_filedata()
Dim filedata() As Byte
Dim i As Integer

  filesize = LOF(2)
    For i = 1 To filesize
        Get #2, i, filedata
        Winsock3.SendData filedata
    Next i
    Winsock1.SendData "::end::"
    Close (2)

End Sub

受信側:
Private Sub Winsock4_DataArrival(ByVal bytesTotal As Long)
    Dim filedata As Byte
    Dim test As String
    Winsock4.GetData filedata, vbByte, bytesTotal
    Put #1, 1, filedata
        
End Sub


nanashi  2003-04-18 19:09:50  No: 106747

Byte配列で取得するとか、データがあるだけ何度もGetDataするとか。
どちらも試したことはありませんが。


Loreley  2003-04-18 21:02:31  No: 106748

>最初の1バイトのみ受信し、2バイト目以降のデータに関しては
>受信しないまま転送が終わってしまいます。

この判定の根拠が
>Put #1, 1, filedata
で記録されたファイルにあるのであればそれかもしれません

Put #1, , filedata
でないと、常にファイルの先頭1バイト目に、
サイズ1バイトのデータ(filedata)を書き込んでいるので
ファイルサイズは常に1バイトとなります。

Winsock4.GetData filedata, vbByte, bytesTotal
ではなくて、
Winsock4.GetData filedata, vbByte
にしたほうが安全だと思います。
bytesTotalにするなら、
nanashiさんがおっしゃっているように、Byte配列で取得し、
またこちらもnanashiさんがおっしゃっていますが
データがまだ残っていないか調べる必要もあると思います


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

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






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