• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Winsockを利用したファイルの送受信について)

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

hiromichel2000の回答

回答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

  • VB6のwinsockでconnectできない

    socketでconnectすると、sckclosingとなって通信できない。 機械との通信プログラムをつくるため、インターネットから以下のようなサンプルを取って、同一コンピュータ、または異なるコンピュータ間で通信しようとした(一部省略、改変)が、stateが8となってしまいます。socketを使うのは初めてで、皆目見当がつきません。よろしくお願いします。 サーバー側 Private Sub Form_Load() Winsock1.LocalPort = 1001 Winsock1.Listen -------- End Sub Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim dat As String, ans As String Dim n As Integer Winsock1.GetData dat Text1.Text = dat Winsock1.SendData "わかりません" End Sub Private Sub Form_Load() Text1.Text = "abc" (正しいコンピュータ名を入れた) Winsock1.Close LabCon.Caption = "Closed": LabCon.BackColor = vbWhite End Sub クライアント側 Private Sub Command1_Click() Winsock1.Close Winsock1.RemoteHost = Text1.Text Winsock1.RemotePort = 1001 'ポート番号設定 Winsock1.Connect Do While (Winsock1.State <> sckConnected) LabCon.Caption = Winsock1.State DoEvents Loop End Sub クライアントでcommand1ボタンをクリックすると最初はstateが0、ループに入ると8となって出られません。WindowsXP、Vista共に同じ結果でした。

  • WinsockでwebにPOSTした後の処理について

    Winsockコントロールを使って掲示板などにPOSTでデータを送信する際、ヘッダー部分で Content-Length: ~~~ も送信してるのですが、 Content-Length:の値分のDATA?を送らないとサーバー側がずっと待機する状態になると思うのですが、 これはWinsockのCloseメソッドを使えばサーバーの待機状態が解除されますか? また、SendDataの途中でプログラムを終了する場合もCloseメソッドでいきなり閉じても大丈夫でしょうか? 自分が書いた該当部分のソースは下記の通りです。 Dim strHead As String 'ヘッダー Dim strData As String 'データ 'いろいろな処理  strHead=strHead & vbCrLf & "Content-Length: " & LenB(StrConv(strData, vbFromUnicode)) & vbCrLf & vbCrLf  'strHeadとstrDataにはきちんとデータが入ってる  Winsock1.SendData strHead & strData End Sub そして Winsock1_DataArrivalプロシージャーに Dim strBuf As String  Winsock1.GetData strBuf  If Instr(1,strBuf,"</HTML)") > 0 Then   Sleep 1000:DoEvents   Winsock1.Close  End If Form_QueryUnloadプロシージャーに  Sleep 1000:DoEvents  Winsock1.Close End Sub

  • Excel2003VBA Variantについて

    教えてください。 下記にxのコードとyのコードとwのコードとを記載しました。 この内、 wのコード、xのコードでは(3)も含めノーエラーで終わるのですが、 yのコードでは(3)でエラーになってしまいます。 エラー内容は 「インデックスが有効範囲にありません。」 です。 どうしてでしょうか? ご教示をお願い致します。                記 Sub w() Dim B As Variant     ReDim B(1) '・・・(1)     ReDim B(5) '・・・(2)     ReDim B(10)     ReDim Preserve B(15) '・・・(3) End Sub Sub x() Dim B As Variant     ReDim B(1)     B = Split("B4:C15,D4:E15,F4:G15,B4:G15", ",") '・・・(1)     ReDim Preserve B(5) '・・・(2)     ReDim B(10)     ReDim Preserve B(15) '・・・(3) End Sub Sub y() Dim B As Variant     ReDim B(1) '・・・(1)     ReDim B(5) '・・・(2)     B = Evaluate("row(A1:A10)")     ReDim Preserve B(15) '・・・(3) End Sub                          以上

  • マクロでのワイルドカードの使い方について

    マクロ初心者です! 下記の動きを実現したいです。 (1)ファイル「*あいう*」(※)の「シート#1」のF5→AE24までの値をコピー →上記の値をすべて加算し、「貼り付け先ファイル」のF5→AE24に貼り付け ※「某フォルダ」に存在する、ファイル名に「あいう」を含むすべてのファイル(ファイル数は可変)が対象 (2)上記を同様の動きを、範囲のすべてのセルでなく、 (F25:F42)、(H25:H42)、、~(AD25:AD42)と1列ごとに対して行う 方々で知識のある方からご助力いただき、 下記の「それっぽい」記述までは辿り着いたのですが、上手く動かず。。 また、(1)と(2)は1つにできるのでは?とも推測してますが、どのように書けば間違いないのかわからない状況です…! 知識のある方から、間違いや改善点などご教示いただけたらとてもうれしいです。 Sub (1)() Dim folder As String Dim dws As Worksheet Dim sfile1 As String Dim swb1 As Workbook Dim adr As String folder = "C:\Users\某フォルダ\" Set dws = ThisWorkbook.Worksheets("貼り付け先シート") sfile1 = Dir(folder & "*あいう*.xlsm") If sfile1 = "" Then Exit Sub Set swb1 = Workbooks.Open(folder & sfile1) adr = Range(Cells(5, 6), Cells(24, 31)).Address(0, 0, 1) swb1.Sheets("シート#1").Range(adr).Copy dws.Range(adr).PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd swb1.Close False End Sub Sub (2)() ((1)と同じ宣言) Dim c As Integer folder = "C:\Users\某フォルダ\" Set dws = ThisWorkbook.Worksheets("貼り付け先シート") sfile1 = Dir(folder & "*あいう*.xlsm") If sfile1 = "" Then Exit Sub Set swb1 = Workbooks.Open(folder & sfile1) For c = 6 To 30 Step 2 adr = Range(Cells(25, c), Cells(42, c)).Address(0, 0, 1) swb1.Sheets("シート#1").Range(adr).Copy dws.Range(adr).PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd Next swb1.Close False End Sub

  • マインスイーパーもどき(VBA)

    ExcelのVBAでマインスイーパーもどきを作っていますが、どうも上手くいきません。9が地雷で0が何もないと言うことです。以下、ソースです。 Sub mine() Dim minefield(11, 13) As Integer Dim i As Integer, a As Integer, b As Integer, x As Integer x = 0 Randomize For i = 1 To 20 a = Int(Rnd * 10) + 1 b = Int(Rnd * 12) + 1 If minefield(a, b) = 9 Then x = x + 1 i = i - 1 End If minefield(a, b) = 9 Next i MsgBox "地雷が" & x & "回重複" countMine minefield, 10, 12 showInt minefield, 10, 12 show minefield, 10, 12 End Sub Sub show(f() As Integer, h As Integer, w As Integer)  Dim a As Integer, b As Integer For a = 1 To 10 For b = 1 To 12 If (f(a, b) = 9) Then CStr(f(a, b)) = "*" If (f(a, b) = 0) Then CStr(f(a, b)) = " " Next b Next a End Sub If (f(a, b) = 9) Then CStr(f(a, b)) = "*" If (f(a, b) = 0) Then CStr(f(a, b)) = " " の部分でコンパイル時に 「コンパイルエラー:修正候補 識別子」 とでます。ヘルプを見てもよくわかりませんでした。 テキストが長すぎるので途中は省きました。 よろしくお願いします。

  • 画像ファイルを保存する方法

    洗濯してる画像を保存するvbaコードが知りたいのですが Sub Sample() Dim PicFile As String Dim myRess As Variant PicFile = "C:\Users\test.jpg" ActiveSheet.Pictures.Insert PicFile ActiveSheet.Pictures.Insert(PicFile).Select PicFile = Selection.Name myRess = ActiveSheet.Shapes(PicFile).Picture.Export( _ ThisWorkbook.Path & "\test.jpg", "JPG", False) End Sub だと実行時エラー438になります。 Export メソッドは、グラフにしか使えないのでしょうか? 画像ファイルを保存する方法をご教授ください。

  • 括弧が含まれる文字列の括弧の中身の文字列(VB6)

    括弧()の中身の文字列をそれぞれ配列の文字列変数に設定したいと考えているのですが、Replaceを使えばいいのでしょうか? また、Replaceは置き換える文字の検索の開始場所は設定できると思うのですが、置き換える文字の検索の終了の場所は設定できるのでしょうか? 例えば、(asdf)as(asdfe)as(sf)という文字列のasdf,asdfe,sfをそれぞれ配列を使って文字列変数として表したいのです。 nyuuryoku = Text1.Text For i = 1 To Len(nyuuryoku) If Mid(nyuuryoku, i, 1) = "(" Then k = k + "と" + CStr(i) j = j + 1 ElseIf Mid(nyuuryoku, i, 1) = ")" Then m = m + "と" + CStr(i) l = l + 1 End If Next i Text17.Text = "( は" + CStr(j) + "個" + k + "番目、 " + ") は" + CStr(l) + "個" + m + "番目" For i = 1 To Len(nyuuryoku) If Mid(nyuuryoku, i, 1) = "[" Then kk = kk + "と" + CStr(i) jj = jj + 1 ElseIf Mid(nyuuryoku, i, 1) = "]" Then mm = mm + "と" + CStr(i) ll = ll + 1 End If Next i Text2.Text = "[ は" + CStr(jj) + "個" + kk + "番目、" + "] は" + CStr(ll) + "個" + mm + "番目" Dim kakkohajime(50) As Long Dim kakkoowari(50) As Long Dim kakkonakami(50) As String For i = 1 To CStr(j) kakkohajime(0) = 1 kakkohajime(i) = InStr(kakkohajime(i - 1), nyuuryoku, "(") Next For i = 1 To CStr(j) kakkoowari(0) = 1 kakkoowari(i) = InStr(kakkohajime(CStr(j) + 1 - i), nyuuryoku, ")") Next このあとにkakkohajime(i)の場所からkakkoowari(i)の場所までの文字列をそれぞれkakkonakami(i)の配列の文字列にいれたいのです。 最後に、kakkonakami(i)をtextに表示したいと思っています。

  • エクセル ユーザーフォームテキストボックスについて

    テキストボックスからセルへの入力について教えていただきたいのですが、 ネットからサンプルを落として勉強しております。 以下のコードを下の画像のように見出しを3から7まで項目を増やしたい場合、 どの部分を書き換えたらいいのでしょうか? よろしくお願いいたします。 Private Sub CommandButton1_Click() Dim LASROW As Long Dim f As Long With Worksheets("Sheet1") 'A列の最終行を取得 LASROW = .Range("A" & CStr(Rows.Count)).End(xlUp).Row 'セルに書き込み For f = 0 To 2 .Range("A" & CStr(LASROW)).Offset(1, f).Value = Me.Controls("TextBox" & f + 1).Value Next End With 'TextBox1,2,3をクリア For f = 1 To 3 Me.Controls("TextBox" & f).Value = "" Next 'TextBox1にフォーカスを移動 Me.TextBox1.SetFocus End Sub

  • ユーザーフォーム、リストボックスに重複なしのリスト

    ユーザーフォームリストボックスに 重複なしのリストを作りたく、調べたところ以下のソースを発見しました。 記載した所思った通りに実装できたのですが ソースがのっていたのは 詳しく解説しているサイトではなくよくわからぬままソースのコピーで実装しています 出来れば、下記の解説をお願いしたいです Private Sub UserForm_Initialize() Dim f As Long Dim v As Variant Dim Lrow As Long Dim WS As Worksheet Set WS = Worksheets("Sheet1") Lrow = WS.Range("A" & CStr(Rows.Count)).End(xlUp).Row v = WS.Range("A1:A" & CStr(Lrow)).Value With CreateObject("Scripting.Dictionary")    For f = 1 To UBound(v)       .Item(v(f, 1)) = Empty    Next    ListBox1.List = .Keys End With End Sub

  • DatagridviewComboboxCellについて聞きたいですが

    DatagridviewComboboxCellについて聞きたいですが、 各セルのコンボボックスに違い値を入れたいけど、以下のエラーが出ました。 "指定されたセルはグリッドにすでに属しています"。 ソース例: Dim Reader As FileReader = New FileReader("C://text.txt") Dim cbb as New DatagridviewComboboxCell() Dim cbb1 as New DatagridviewComboboxCell() Dim strA as String = "" Dim t as integer = 0 Me.Controls.Add(Dtgrdview) Dtgrdview.ColumnCount = 5 . (省略) For i as Integer = 0 to 10 Select case strA Case "A" cbb.Items.Add(Cstr(i)) Case "B" cbb1.Items.Add(Cstr(i+1)) End Select Next With Dtgrdview.Rows While not Reader.EndofData     Dim _readFile As readFile = New readFile(Reader.ReadFields()) '(readFile.vbは別) Dim row As String() = _ {_readFile.Class,_readFile.Name,_readFile.Year,_readFile.Add} ' Dtgrdview.Rows.Add(row) Select Case _readFile.ID Case "A" Dtgrdview.Rows(t).Cells(4) = cbb ==> t= 1 エラーが出る Case Else Dtgrdview.Rows(t).Cells(4) = cbb1 End Select t += 1 End While ReadFile.Close() End With 解決方法を教えてください。ありがとうございます。