掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
バイナリファイル通信について (ID:88255)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
ひとつへなちょこな例を。 フォームにCommand1とWinsock1とWinsock2を貼り付けて以下のコードを書く Winsock1が送信側でWinsock2が受信側とした。 Command1をクリックして送信開始となる。 '----------------------------------- 送信側 Private Sub Command1_Click() Dim lngFileLen As Long 'ファイルサイズ Dim lngSendBytes As Long '送信済みバイト数 Dim intF As Integer 'ファイル番号 Dim lngPduSize As Long '送信パケットデータサイズ Dim bytSend() As Byte '送信バッファ Winsock1.RemoteHost = "127.0.0.1" '適当なホスト Winsock1.RemotePort = 20000 '適当なリモートポート Winsock1.Bind 20001 '適当なバインドポート intF = FreeFile Open "適当なファイル名" For Binary As intF lngFileLen = LOF(intF) 'ファイルサイズの取得 lngSendBytes = 0 '送信済みバイト数 lngPduSize = 5000 '1回の送信バイト数をとりあえず5000にする ReDim bytSend(lngPduSize - 1) '送信バッファのサイズをPDUのサイズにする Do While lngSendBytes < lngFileLen Debug.Print lngSendBytes, lngFileLen If lngFileLen - lngSendBytes < lngPduSize Then '最後の送信バッファのサイズを調整 ReDim bytSend(lngFileLen - lngSendBytes - 1) lngSendBytes = lngFileLen Else '送信済みバイト数をカウントアップ lngSendBytes = lngSendBytes + lngPduSize End If Get intF, , bytSend 'ファイルより送信データを取得 Winsock1.SendData bytSend '送信 DoEvents 'システムに送信するタイミングを与える Loop Close intF End Sub '----------------------------------- 受信側 Private Sub Form_Load() Winsock2.RemoteHost = "127.0.0.1" '適当なホスト Winsock2.RemotePort = 20001 '適当なリモートポート Winsock2.Bind 20000 '適当なバインドポート End Sub Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long) Dim RecvData() As Byte Dim intF As Integer Winsock2.GetData RecvData intF = FreeFile Open "適当なファイル名2" For Binary As intF Seek intF, LOF(intF) + 1 Put intF, , RecvData Close intF End Sub ただ、これを実行してみたら分かると思うが、致命的な欠点がある。 送信側で続けて別のファイルを送信すると受信側でファイルが変わったかどうか の判断ができないため延々と同じファイルに追記し続けることになる。 最初にファイルサイズを予め送信側から受信側に通知しておけば 受信側でファイルの終わりを検知することができるようになる。 そうすればSeekなんて作業もしなくてよくなるので処理も若干速くなるかも。 でもUPDはパケットの到着順序が保証されていないから結局もっとしっかりした プロトコルを作って通信しないとだめかも。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.