こんにちは。現在、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
No.2ベストアンサー
- 回答日時:
>例えばファイルサイズが1000バイトで、クライアント側からサーバ側に
>Senddataで1000バイトを送信すると、サーバ側では700バイトとか
>違った数字で受信されてしまいます。これは、BytesTotalの値のことです。
>どうしてそうなるのか、全く理解できません。
そういう仕様だからです。
WinSockでは受信処理で、受信データの制御はできません。
あなたのプログラムで、予期しないバイト数でデータを受信したときの処理を
実装する必要があります。
ありがとうございます。
やってみます。
どうもありがとうございました。
初心者なので、またわからなくなったら質問しますのでどうぞ
よろしくお願いします。
No.1
- 回答日時:
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
ソケットのクローズについて
-
UDP通信する時に、相手にどうや...
-
WinSockでの通信プログラムがう...
-
エクセル VBA でのCOMポート...
-
recv関数でフリーズしてしまう
-
UDP通信(SNMP)したいが、うま...
-
UDPで受信終了の合図を出して受...
-
Winsockで接続待ちタイムアウト...
-
JavaでBASIC認証突破
-
クライアントソケットMACアドレ...
-
UDP通信におけるbind関数について
-
winsockでファイル転送
-
VB6のwinsockでconnectできない
-
UDPのソケットプログラミング
-
非ブロッキングソケットのrecv...
-
バインドと接続(BindException...
-
空きポートの取得方法
-
ソケット通信 同じポート番号...
-
ソケットのrecvの戻り値が0
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
エクセル VBA でのCOMポート...
-
UDP通信する時に、相手にどうや...
-
UDP通信におけるbind関数について
-
UdpClient 送信元のIPアドレ...
-
Winsockで接続待ちタイムアウト...
-
recv関数でフリーズしてしまう
-
ソケットのクローズについて
-
ソケットのrecvの戻り値が0
-
Socket通信の0バイト受信について
-
ソケット通信 同じポート番号...
-
相手のIPアドレスを取得する方法
-
ソケットでクライアントのipア...
-
VB6のwinsockでconnectできない
-
Connectエラーが出てしまう・・...
-
ソケット通信の送受信遅延-02 ...
-
同じLAN内パソコンのIPアドレス...
-
WinSockでの通信プログラムがう...
-
UDPのソケットプログラミング
-
非ブロッキングソケットのrecv...
おすすめ情報