OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

Winsockを利用したファイルの送受信について

  • すぐに回答を!
  • 質問No.219953
  • 閲覧数858
  • ありがとう数3
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 62% (5/8)

こんにちは。現在、VisualBasicでwinsockを利用して
jpg画像の転送をやりたいと思っているのですが、うまくいきません。
制御用のプログラムなのでjpg画像は2分割して送ります。
ちょっと汚いソースで申し訳ないのですが、クライアント側は以下のようになってます。ソケット1で通信の制御信号を送受信して、ソケット2で実際の画像データを送信します。画像は2分割にして送ります。

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim sSend As String
Dim buffer() As Byte
Dim lSendSize As Long

Winsock1.GetData buf, vbString, bytesTotal
Select Case buf
Case SIG_REQUESTIMAGE
    f = FreeFile
sFile = "send.jpg"
Open sFile For Binary As #f
lFileSize = LOF(f)
sSend = CStr(lFileSize)
Winsock1.SendData sSend
DoEvents
Case "reciv_size" '画像サイズ受信確認信号1
      lSendSize = lFileSize - 1
l1SendSize = lSendSize / 2
l2SendSize = lSendSize - l1SendSize
ReDim buffer1(l1SendSize)
ReDim buffer2(l2SendSize)
Get #f, , buffer1
      sCommand = CStr(buffer1)
Get #f, , buffer2
Winsock2.SendData sCommand
 Case "reciv1" '画像サイズ受信確認信号2
sCommand = CStr(buffer2)
      Winsock2.SendData sCommand
      Close #f
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル10

ベストアンサー率 31% (47/149)

>例えばファイルサイズが1000バイトで、クライアント側からサーバ側に
>Senddataで1000バイトを送信すると、サーバ側では700バイトとか
>違った数字で受信されてしまいます。これは、BytesTotalの値のことです。
>どうしてそうなるのか、全く理解できません。

そういう仕様だからです。

WinSockでは受信処理で、受信データの制御はできません。
あなたのプログラムで、予期しないバイト数でデータを受信したときの処理を
実装する必要があります。
補足コメント
hiromichel

お礼率 62% (5/8)

いろいろしらべてみまして、なんとかできました。
ありがとうございました。
投稿日時 - 2002-02-19 01:25:13
お礼コメント
hiromichel

お礼率 62% (5/8)

ありがとうございます。
やってみます。
どうもありがとうございました。
初心者なので、またわからなくなったら質問しますのでどうぞ
よろしくお願いします。
投稿日時 - 2002-02-18 16:48:48
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル1

ベストアンサー率 0% (0/1)

hiromichelです。 先ほどの続きです。サーバ側のほうはこのようになっています。 Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long) Dim buf() As Byte Static counter As Long If StateFlag = 1 Then ...続きを読む
hiromichelです。
先ほどの続きです。サーバ側のほうはこのようになっています。

Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
Dim buf() As Byte
Static counter As Long

If StateFlag = 1 Then

ReDim buf(bytesTotal - 1)
    Winsock2.GetData buf ', vbArray + vbByte, bytesTotal

Put #f, , buf

StateFlag = 1

Winsock1.SendData "reciv1"
End If
If StateFlag = 1 Then
ReDim buf(bytesTotal - 1)
    Winsock2.GetData buf ', vbArray + vbByte, bytesTotal
Put #f, , buf

If ProgressBar1.Value = ProgressBar1.Max Then

counter = counter + 1
Close #f
DoEvents


と、ソースは上のようになっていますが、問題は、
例えばファイルサイズが1000バイトで、クライアント側からサーバ側に
Senddataで1000バイトを送信すると、サーバ側では700バイトとか
違った数字で受信されてしまいます。これは、BytesTotalの値のことです。
どうしてそうなるのか、全く理解できません。締め切りが近くて困ってます...。
良いアドバイス、解決法などを待っています。どうかお願いします。
    
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ