WinsockコントロールのErrorイベントでオーバーフロー

このQ&Aのポイント
  • VisualVasic 6.0 Professional Edition (SP 5)を使用しています。WinsockコントロールのErrorイベントに関する質問です。エラーコードの設定値でオーバーフローしてしまう問題が発生しています。対策方法を教えてください。
  • VisualVasic 6.0 Professional Edition (SP 5)を使用しています。WinsockコントロールのErrorイベントで起きるオーバーフローの問題について質問です。エラーコードの設定値がオーバーフローしてしまうため、正しい処理ができません。対策方法を教えてください。
  • VisualVasic 6.0 Professional Edition (SP 5)を使用しています。WinsockコントロールのErrorイベントで起こるオーバーフローに関する質問です。エラーコードが正しく渡されないことにより、プロトコルや接続の状態が正しく判断できません。どのような対策をすればよいでしょうか?
回答を見る
  • ベストアンサー

WinsockコントロールのErrorイベントでオーバーフロー

VisualVasic 6.0 Professional Edition (SP 5)を使用しています。 WinsockコントロールのErrorイベントに関する質問です。このイベントでエラーを出したいと思っているのですが、 オーバーフローしてしまい、うまくいかず困っています。 MSDNライブラリの説明では、 object_Error(number As Integer, _ Description As String, _ Scode As Long, (以下略) というふうになっていて numberの説明は、「エラー コードが整数で渡されます。 返される値については、次の「設定値」を参照してください」 となっています。 ここまでは良いのですが、その設定値で 「sckBadState :(値)40006 要求されたトランザクションまたは要求に対して、 プロトコルまたは接続の状態が正しくありません。」 などの値がnumberに渡ってしまうとオーバーフローしてしまいます。 何か良い対策方法はないでしょうか? 現在は、 Select Case Number Case sckBadState '40006 --処理内容-- End Select などというふうに書いています。 よろしくお願いします。

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

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

たぶん、エラーコードは符号なし2byte整数なのかな それをlong型に変換してやればいいと思います。 Private Sub Winsock1_Error(Number As Integer, (以下略) Select Case UnsignedShort2Long(Number) Case sckBadState End Select End Sub 'Unsigned Shortをlong型に変換 Private Function UnsignedShort2Long(ByVal n As Integer) As Long If (n >= 0) Then UnsignedShort2Long = n Else UnsignedShort2Long = &H8000& + (n And &H7FFF) End If End Function

その他の回答 (1)

noname#62349
noname#62349
回答No.2

Integer型は、-32,768 ~ 32,767の範囲以外だと オーバーフローします。#1の方がおっしゃるように Long型なら-2,147,483,648 ~ 2,147,483,647まで 大丈夫なのでこれでいけるでしょう。 エラーナンバーは整数値なのでSingle型やDouble型に する必要はありません。

関連するQ&A

  • winsock通信時エラーの回避

    winsock通信でデータをクライアント側からサーバー側に送り、一定の条件でサーバー側からクライアント側にデータを戻すソフトを作成中なのですが、サーバー側が通信エラーの為か止まってしまいます。 サーバー側(winsock部分)記述 Private Sub Winsock1_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean) Winsock1(Index).Close '接続を閉じる Do While Not (Winsock1(Index).State = sckClosed) DoEvents Loop On Error Resume Next Winsock1(Index).Listen If Winsock1(Index).LocalPort <> 0 Then Winsock1(Index).LocalPort = 0 End If End Sub 質問の整理ですが、 表示板にはギミックが付いておりそのギミックは止まらないのでパソコンのフリーズでは無い様子です。 で問題は通信部分だと推測されるのですが、そのエラーを起こした通信を破棄してもいいので、サーバー側の点数加算を止めない方法はありませんでしょうか。 また上記のWinsock1_Errorコードの記述じゃおかしいのでしょうか。

  • VB6.0でwinsockの配列を作るには

    サーバプログラムを作ろうと思っているのですが、 サーバなので接続されるたびに i = i + 1 Load wsock(i)   'wsockはwinsockコントロール という風に増やしたいです。 しかし Option Explicit Dim wsock() As Winsock このように宣言しても実行時に「インデックスが有効範囲にありません」とエラーが出ます。 かなり初歩的な質問だと思いますが、参考になるサイトまたはどのように書けば良いのか教えてください。

  • WinSockを使ってのプリンタ接続・データ送信

    現在LANで接続されたプリンタに文字列を印字させるプログラムを作成しているのですが、プリンタ側のIPアドレス、使用するポート(今回は1024という指定があったのでそれに設定)を設定し、印字処理をはしらせたのですが、そこでエラーが発生してしまいます。簡略化していますが、プログラムは Private sckWinsock As Winsock Set sckWinsock = Winsock1 sckWinsock.Protocol = sckTCPProtocol sckWinsock.RemoteHost = "192.168.0.***" sckWinsock.RemotePort = 1024 sckWinsock.LocalPort = 0 sckWinsock.Connect strData = "テスト印字" sckWinsock.SendData strData sckWinsock.Close エラーは sckWinsock.SendData strData ここで発生し、『指定したトランザクションまたは要求のプロトコルまたは接続状態に問題があります。』とでます。 PINGはちゃんと通りますし、プリンタ設定にあるテスト印字は問題なく機能するので、プリンタとの接続がまずいとは思えないのですが・・・ WinSockを使うのは初めてなので勝手がわからなく苦戦中です どなたかわかる方、お返事お待ちしています

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

    こんにちは。現在、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

  • 2013VBでオーバーフローエラー(2)

    よろしくお願いします。 前回の質問ではエラーの出た部分しか表示していなかった為、回答して頂いた方に 十分な情報が提供できずすみませんでした。 下記がエラーの出た部分までの全プログラムです。 Dim book1 As String 'ブック名1 Dim book2 As String 'ブック名2 Dim book3 As String 'ブック名3 Dim book4 As String 'ブック名4 Dim myday As Date Dim ITI1 As String 'アドレスの格納 Dim ITI2 As String 'アドレスの格納 Dim ITI3 As String 'アドレスの格納 Dim ITI4 As String 'アドレスの格納 Dim ITI5 As String Dim ITI6 As String Dim ITI7 As String Dim ITI8 As String Dim myRange As Range 'コードの個数 Dim myRange1 As Range Dim answer As Integer Dim bunki1 As Integer Dim c As Double 'カウント Dim n As Double 'カウント 'ワークブックの設定 Workbooks("A.xls").Activate book1 = Worksheets("ブックシート設定").Range("c3") 'コピー元 'book2 = Worksheets("ブックシート設定").Range("c5") book3 = Worksheets("ブックシート設定").Range("c7") 'A 'book4 = Worksheets("ブックシート設定").Range("c9") bunki1 = Worksheets("ブックシート設定").Range("c16") myday = Worksheets("ブックシート設定").Range("c14") 'コピー元非表示を表示にする Workbooks(book1).Activate Sheets("B").Select Sheets("B").Select Columns("G:J").Select Selection.EntireColumn.Hidden = False Columns("j:q").Select Selection.EntireColumn.Hidden = False 'コードの個数を数える Workbooks(book1).Activate Sheets("B").Select ITI4 = Range("b65536").End(xlUp).Address '----b列の最終行から上方向の終端セルを選択 Set myRange = Worksheets("B").Range("b6", ITI4) answer = Application.WorksheetFunction.Count(myRange) Set myRange1 = Worksheets("B").Range("e8") For c = 1 To answer 'データー個数のカウント If myRange1.Offset(c) = myday Then n = n + 1 Next 'オーフィルターの設定 Workbooks(book1).Activate Sheets("B").Select ITI1 = Range("b65536").End(xlUp).Address '----b列の最終行から上方向の終端セルを選択 ITI7 = Range(ITI1).Offset(, 11).Address Range("a8", ITI7).AutoFilter FIELD:=5, Criteria1:=Format(myday,"yyyy/m/d") >>>>>ここでオーバーフローエラー 前回指摘されたCriteria1:=mydayをCriteria1:=Format(myday,"yyyy/m/d") に追加変更しました。 読みにくいかもしれませんがよろしくお願いします。

  • Keydownイベントについて

    VB6.0について質問です。 FormでKeydownイベントが動きません。 どのような原因が考えられますか? コードは以下のように記述しています。 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case vbKeyF8 cmd_F8.Value = True Case vbKeyF9 cmd_close.Value = True End Select End Sub

  • エクセル イベントマクロのエラー回避

    イベントマクロを初めて書いてみたのですが A列を全部選択して削除などをするとエラーがて出てしまいます 回避するにはどのようにしたら良いのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A:A")) Is Nothing Then Select Case Target.Value Case Is = "りんご" cellColor = 3 Case Is = "みかん" cellColor = 6 End Select End If If Not Intersect(Target, Range("B:B")) Is Nothing Then Select Case Target.Value Case Is = "りんご" cellColor = 6 Case Is = "みかん" cellColor = 3 End Select End If Target.Interior.ColorIndex = cellColor End Sub 以上が書いたものです。 皆様の知恵お貸しください 宜しくお願いします。

  • VBAマクロエラー【オーバーフローしました。】

    以下のVBAマクロで突然エラーが出るようになってしまいました。 原因がわからず困っています。 どなたかご教授ください。 該当部分 :S = Range("B2").End(xlDown).Row エラーMrg:実行時エラー'6': オーバーフローしました ----------マクロ文---------- Sub 部担コード読み替え() Dim R_Count As Integer Dim P_Sheet As String Dim S As Integer 'データ取込用のファイルを開く Workbooks(D_Book).Activate Sheets("Data1").Select Columns("C:C").Select Selection.Insert Shift:=xlToRight Range("B2").Select S = Range("B2").End(xlDown).Row Range("C2:C" & S).Formula = "=SUBSTITUTE(SUBSTITUTE(RC[-1],""%"",""1""),""*"",""2"")" Range("C1").Value = "部担コード" Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues Columns("B:B").Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Range("A1").Select Sheets("Data2").Select Columns("C:C").Select Selection.Insert Shift:=xlToRight Range("B2").Select S = Range("B2").End(xlDown).Row Range("C2:C" & S).Formula = "=SUBSTITUTE(SUBSTITUTE(RC[-1],""%"",""1""),""*"",""2"")" Range("C1").Value = "部担コード" Columns("G:G").Select Selection.Insert Shift:=xlToRight Range("G2:G" & S).Formula = "=SUBSTITUTE(SUBSTITUTE(RC[-1],""%"",""1""),""*"",""2"")" Range("G1").Value = "キー" Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues Columns("B:B").Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Columns("E:E").Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Range("A1").Select End Sub

  • Winsockプログラミング Connectのエラーについて

    お世話になっております。 現在、Windowsソケットプログラム(winsock1.1)により、P2Pでの非同期のTCP通信プログラムを組んでます。 そこで、クライアントからサーバーへの同時接続のチェックをするために以下のような処理を行っています。 #関係ありそうな情報のみ載せます。足りなければご質問下さい。 OSはWindowsXP HomeEditionです。 なお、OSによる同時接続制限はBiotというツールにより20000というふうに設定しております。 ・クライアント 1.ソケット3000個用意 2.for文ループ処理によりソケット数分Connectを実行 ・サーバー 1.listenの同時接続最大数は20000に設定 毎回Connect実行時、大体2000回目辺りからエラーが出てきます。 その後、イベントが返って来た時のエラーチェックでも、WSAECONNREFUSED(10061)で「サーバーにより接続が拒否された。」というエラーが検出されます。 結局、接続成功は500~700回ぐらいでした。 この現象に対する対処法や解決法はないでしょうか? 現状では、全てのConnect要求を成功できるようにしたいと思っております。 子プロセスを作成するような方法は時間が無いので考えておりません。 9/18にも同じようなしておりますが、前より詳細を書いて再投稿いたしました。 以上、よろしくお願い致します。

  • SQLserver算術オーバーフローエラーについて

    使用環境は DB SQL Server2008 Express 使用ツールは Microsoft SQL Server Management Studio です SQLserver2000からSQLserver2008DBへ移行しようとしているのですが ストアドプロシージャのところでうまくいきません 具体的には、処理を走らせると下記メッセージが出てきます floatをデータ型numericに変換中に、算術オーバーフローエラーが発生しました プロシージャ"○○"は、許可されていないステータスNULLを返そうとしました。 代わりにステータス0を返します 調べると  小数点以下があるフィールド同士を掛けて、その結果の小数点以下をROUNDで切り 捨てた値を小数点のないフィールドに追加しようとするとエラーになる  とありました。 下記 2行あたりが怪しいと思うのですが対処方法がわかりません。 ご教授願えないでしょうか? SET @GetRand = CAST(RAND()*10 AS numeric(1,0)) … SET @GetRand = CAST(RIGHT(CONVERT(varchar,CAST(RAND()*100 AS numeric(2,0))+100),2) As numeric(2,0)) またストアドプロシージャは、VBのようにデバッグで1行単位で処理を確認してい くことはできないのでしょうか?

専門家に質問してみよう