• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VB6のwinsockでconnectできない)

VB6のwinsockでconnectできない

このQ&Aのポイント
  • socketでconnectすると、sckclosingとなって通信できない
  • 機械との通信プログラムをつくるため、インターネットから以下のようなサンプルを取って、同一コンピュータ、または異なるコンピュータ間で通信しようとしたが、stateが8となってしまいます
  • socketを使うのは初めてで、皆目見当がつきません

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

  • ベストアンサー
  • unacyo
  • ベストアンサー率51% (35/68)
回答No.2

確認させてください。 ・サーバのコードはそれだけ? Winsock_Accept()は作っていませんか? 8はsckClosingで、接続を相手が解除しようとしている状態です。 つまり、接続を受け付けるコードがないと接続を受け付けることができないので、切断されてしまいます。 Winsock_AcceptにrequireIdが渡されるので、それをAcceptしてください。 Winsock1.Accept requireId ←これで、サーバが接続を受け付けます 幾つか気がついたことを。 ・LocalPortの初期化 バグと言うか、仕様なのですが、Connectするまえに、LocalPortを0クリアしてあげないと、二回目の接続がエラーになります。 RemotePort=1001の次の行にでも、いれてあげてください。 ・なるべくWinsockのイベントハンドラを使う 一つのイベントに作り込んでループで待つと、通信が行われなかったり、ループとループの間の変化が捉えきれなかったりします。 今回のも、もしかすると、Winsock_Connectedを使っていれば、接続が解除されていたとわかったかもしれません。 (今はVB6の環境が無くなったので、かくにんできませんので、可能性の話なのですが) たしか、SendDataが、Doeventをいれるか、イベントハンドラを終わらせないと、送信されないはずです。 (大分前の記憶なのでうろ覚えなのですが)

yharapan
質問者

お礼

ご指摘の通りでした。ありがとうございます。 この通信は初めてで、Listenをして、DataArraivalで受ければいいのかと思っていましたので、以下の処理があることを見落としていました。 Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long) If Winsock1.State <> sckClosed Then 'Winsockの状態(閉じていない) Winsock1.Close 'Winsockを閉じる End If Winsock1.Accept requestID '接続処理 End Sub ところで、一度connectすると、SendDataとGetDataを繰り返して、最後にcloseしてよいのですか。また、多くのサンプルでLocarPortとRemotePortが同じ番号が使われていますが、このようにするものですか。また、この番号は任意でよいのですか。目的の機械は4444(変更可)です。是非これらの点も教えてください。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • unacyo
  • ベストアンサー率51% (35/68)
回答No.3

ANo.2です。 ・Connectの後はSendData/RecvDataで良いか? そうなります。 ただ、注意しなければならないのは、TCPIPは一度に転送される最小バイト数が1バイトなので、少ないデータ量ならばあまり問題になりませんが、大きいデータの場合一度の受信で全部受信されません。 特にMTUを変更していなければ、通常は1460バイトを越えたあたりから、工夫が必要になります。 わたしは、この辺りを実装するのが面倒なので、Connectイベントでファイルを開き、DataAvaivalイベントで書き込んでいます。 コマンド発行/応答受信の場合は、受信データをファイルに書き込んだ後に終端文字CRLFやETX等があるか確認し、あった場合はファイルを閉じて読みこみ、解析します。 通信が全て終わったら、Closeをすればよいです。しかし、次の通信開始は、Closedイベントが発生するのを待ってください。 ・RemotePortとLocalPortについて RemotePortは、いうなれば、代表電話番号みたいなものなので、基本的に器機が指定するポートを使えば良いです。器機側のポート番号は、特別な理由がなければ、変えない方が良いでしょう。 LocalPortは、指定されていなければ、0指定でokです。 クライアント側のポート番号を固定にしてしまうと、このツールを複数立ち上げれなくなります。 (器機側が複数の接続に対応していることも必要ですが) 0指定は、実際には1025~2048のポートのうち、空いているポートをOSが割り当ててくれます。 接続先の器機が、クライアントのポートを指定しているのであればその番号を、そうでなければ0で問題ありません。

yharapan
質問者

お礼

補足の質問にまで答えていただき、ありがとうございました。 私は、新しいことを始めると、簡単なことでも、エラー情報等が出ていても、すぐにはその原因にたどり着けないことが多いです。今回は、ハードウエアも絡むのかなと思い、余計見当がつきませんでした。大変ありがとうございました。 また、今後、問題が出て、悩みそうなところも、丁寧に書いていただきありがとうございました。とりあえず、コンピュータ上でシュミレートが出来るレベルまでプログラミングができました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

Protocolプロパティを指定していない、ポート番号は正しいか? このあたりが怪しいですね。 ついでながら繋がるまでループさせるのは良くないですね。

yharapan
質問者

補足

早速にアドバイスありがとうございました。 Protocolプロパティは、入れても同じ結果でした。 ループは、上手く動かなかったのでそのようにしたまでです(当初はタイマー等をいれていました)。 ご指摘のポート番号は、全く理解していないので、インターネットのサンプルのままにしています。 目的の機械の番号は分かっているのですが、事前にコンピュータ上でシュミレートしたいと思っています。ポートの断片的な記述は見つかりましたが、理解するに至っていません。コンピュータの場合はどのように決めるのか、アドバイスまたは適当なサイトが有りましたらお教えください。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VB初心者です

    計算結果が"7"の時に限り、「当たり!」と表示される、ちょっと意味不明な計算機を作っています。 現在、下記のように書いてますが、何故かうまくいきません。(当たりが表示されない 何故でしょうか?お助けください。。m(_ _)m Private Sub Command1_Click() Label1.Caption = Str(Val(Text1.Text) + Val(Text2.Text)) Label3.Caption = "+" Label4.Visible = False '画像を隠す。 'いずれかの数字が「7」のとき、メッセージを表示する。 If Label1.Caption = "7" Then Label4.Visible = True End If End Sub Private Sub Command2_Click() End End Sub Private Sub Command3_Click() Label1.Caption = Str(Val(Text1.Text) * Val(Text2.Text)) Label3.Caption = "*" End Sub Private Sub Command4_Click() Label1.Caption = Str(Val(Text1.Text) - Val(Text2.Text)) Label3.Caption = "-" End Sub Private Sub Command5_Click() Label1.Caption = Str(Val(Text1.Text) / Val(Text2.Text)) Label3.Caption = "/" End Sub

  • Winsockのオブジェクトエラー

    こんにちは。EXCEL2000・VBAで、Winsockの使用を考えています。 以下のソースコードを入力して、実行してもオブジェクトが見つかりませんという、エラーが出力されてしまいます。 また、Winsockをアクティブにしようと、 User FormにWinsockのアイコンを追加しようとしても 「サブジェクトは指定された操作に対して信頼されません」 という注意書きがでてしまって、追加できません。 なぜ、このようになるのか、教えていただけますか? よろしくお願いします。 Private Sub CommandButton1_Click() Winsock1.RemoteHost "www.yahoo.co.jp" Winsock1.RemotePort 80 Winsock1.Connect End Sub Private Sub CommandButton2_Click() Winsock1.SendData = TextBox1.Value End Sub Private Sub CommandButton3_Click() Winsock1.Close End Sub

  • VB6 Form内のDragDrop

    VB6でForm内にCommandButtonがいくつか有ります。 各CommandButtonはClickするとShellオブジェクトでファイルを開く様になっています。 やりたいことは 2つのCommandButton間をDragDrop?によりCaptionを入れ替えたいです。 (CommandButton間をマウスDragDropでCaption名入れ替え) MouseDownとDragDropイベントで何とかなると思いましたがうまくいきません。 Dim dd As Integer Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then dd = 1 'CommandボタンNo, End If End Sub Private Sub Command2_DragDrop(Source As Control, X As Single, Y As Single) Dim cn As String cn = Command2.Caption Command2.Caption = Controls("Command" & dd).Caption Controls("Command" & dd).Caption = cn End Sub CommandButtonプロパティでDragModeを自動にするとShellオブジェクトでファイルが開かないし サイトで調べたところファイルの移動やコマンド自体の移動などで分かりませんでした。 ご教授お願い致します。

  • 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でMSChartをタイマーを使い徐々にグラフを伸ばしたい。

    VB6.0でMSChartをタイマーを使い徐々にグラフを伸ばしたいのですが、上手くいきません。コマンドボタンを使いクリックしたと同時にタイマーを作動させて、ある値までグラフを増加させたいと思っているのですが、初心者同然なので詳しくお願いします。 Dim dat(4, 3) As Integer Dim a As Long Private Sub Command1_Click() With MSChart1 .chartType = VtChChartType3dBar .ColumnCount = 3 .RowCount = 4 For i = 1 To .RowCount For j = 1 To .ColumnCount .Column = j .Row = i .Data = dat(i, j) Next j Next i .DataGrid.ColumnLabel(1, 1) = "(1)" .DataGrid.ColumnLabel(2, 1) = "(2)" .DataGrid.ColumnLabel(3, 1) = "(3)" .DataGrid.RowLabel(1, 1) = "1月~3月" .DataGrid.RowLabel(2, 1) = "4月~6月" .DataGrid.RowLabel(3, 1) = "7月~9月" .DataGrid.RowLabel(4, 1) = "10月~12月" .Visible = True End With Timer1.Enabled = True End Sub Private Sub Form_Load() a = 0 MSChart1.Visible = False End Sub Private Sub MSChart1_OLEStartDrag(Data As MSChart20Lib.DataObject, AllowedEffects As Long) End Sub Private Sub Timer1_Timer() a = a + 10 dat(1, 1) = a: dat(1, 2) = 100: dat(1, 3) = 110 dat(2, 1) = 30: dat(2, 2) = 110: dat(2, 3) = 110 dat(3, 1) = 40: dat(3, 2) = 120: dat(3, 3) = 110 dat(4, 1) = 50: dat(4, 2) = 130: dat(4, 3) = 110 If a = 100 Then Timer1.Enabled = False End If End Sub

  • vb6.0のプログラム

    今こんなプログラムを作っているのですがなぜか、足りない部分があると言われて困っております。 できれば教えてください。 図 ーーーーーーーーーーーーーーーー from ーーーーーーーーーーーーーーーー 残り30秒[ーーーーラベルーーーー] 000+000=000←(3つともlabel) □-------------------□←HScrollbar max100 min0 [コマンドボタン] [タイマー]←非表示 ーーーーーーーーーーーーーーーー コード Private intCount As Integer Private intSecond As Integer Private Sub cmdStart_Click() Dim intNum1 As Integer Dim intNum2 As Integer If cmdStart.Caption = "Start" Then intCount = 0 intSecond = 30 lblResult.Caption = "" cmdStart.Caption = "OK" tmrSecond.Enabled = True ElseIf cmdStart.Caption = "OK" Then If CInt(lblAnswer.Caption) = CInt(lblNum1.Caption) + CInt(lblNum2.Caption) Then lblResult.Caption = lblResult.Caption & "○" intCount = intCount + 1 Else lblResult.Caption = lblResult.Caption & "×" End If intNum1 = Rnd() * 50 intNum2 = Rnd() * 50 lblNum1.Caption = intNum1 lblNum2.Caption = intNum2 End If End Sub Private Sub hsbAnswer_Change() lblAnswer.Caption = hsbAnswer.Value End Sub Private Sub tmrSecond_Timer() intSecond = intSecond - 1 lblTime.Caption = "残り" & intSecond & "秒" If intSecond = 0 Then tmrSecond.Enabled = False MsgBox (intCount & "問正解") cmdStart.Caption = "Start" Else End If End Sub どうぞよろしくお願いします。

  • VBで、このようなことはどうやっら出来るのでしょうか?

    こんばんは。単刀直入のこんなことです。 Private Sub Command1_Click() Dim a As Double a = a + 1 Text1.Text = a End Sub このプログラムを実行して、、コマンドボタン1を押すと テキスト1には、1が表示されます。 で、やりたいことは、またコマンドボタン1を押すと、テキスト1には2{a=1(一回目によって代入された値)+1}が表示されるようにしたいのですが、どうすればよいのでしょうか?

  • VBで入力された値をワード文書に表示(OLEオートメーション)

    VBより名前と年齢を入力し、登録ボタンを押すと ワードにデータが登録されるようにしたいのですが、 実行時エラーが表示されます。 Dim x As Object Private Sub Command1_Click() x.Insert.Into Text1.Text & ":" & Text2.Text & Chr(10) ---(1) End Sub Private Sub Form_Load() Set x = CreateObject("Word.Basic") End Sub Private Sub Form_Unload(Cancel As Integer) Set x = Nothing End Sub (1)で 実行時エラー'509'「Insert,文書ウィンドウが選択されていないためコマンドは使用できません」 が表示されます。 考えられる原因はなにか教えてください! VB6.0/WindowsXP SP2/Office 2000 です

  • VB6でスロットを作成したい

    VB6歴2ヶ月の初心者です。 フォーム上に ラベルコントロールが三つ コマンドボタンが二つ タイマーコントロールが一つ あります。 タイマーのプロパティは Enabled False Interval 10 です。 スロットを作成したいのですが、 ボタン1を一回押すごとに左からスロットが回り、 最後にボタン2で動きを止めたいのです。 一応自分でも書いてみたのですが、ここで行き詰まりました。 ウワァァァァァァヽ(`Д´)ノァァァァァァン! Private Sub Command1_Click() Timer1.Enabled = True End Sub Private Sub Command2_Click() Timer1.Enabled = False End Sub Private Sub Timer1_Timer() Dim slot As Integer slot = Int(Rnd(1) * 9 + 1) Label1.Caption = slot End Sub 思い通りに動かすにはどんなコードにしたらいいですか?

  • VB6・一括でファイル名の変更したいのですが

    VB6でファイルリネームツールを作成しています。 DriveListBox・DirListBox・FileListBox・TextBox*2・コマンドボタン*3を配置しています。 実行して、ドライブ・ディレクトリを選択して、FileListBoxに表示されいるファイルをコマンド2ボタンで全部Text2に表示させています。 そこで、text2からファイル名を直接編集して、コマンド3ボタンで編集したファイル名で保存したいのですが、どう記述すれば良いのでしょうか。 Text1とコマンド1の状態は、FileListboxでクリックしたファイルをText1に表示・編集して、コマンド1でファイル名変更できる状態です。 コマンド3のコードですと、 >Set fsofile = fso.GetFile(Dir1.Path & "\" & File1.FileName) の行が、実行エラー53、ファイルが見つかりません。となります。 宜しくお願いします。 現在のコードです。 Private Sub Command1_Click()   Dim fso As New FileSystemObject   Set fsofile = fso.GetFile(Dir1.Path & "\" & File1.FileName)   fsofile.Name = Text1.Text   File1.Refresh end sub Private Sub Command2_Click()   Text2.Text = Clear   Dim fso As New FileSystemObject   For Each myFile In fso.GetFolder(Dir1.Path & "\" & File1.FileName).Files     Text2.Text = Text2.Text & myFile.Name & vbCrLf   Next End Sub Private Sub Command3_Click()   Dim fso As New FileSystemObject   Set fsofile = fso.GetFile(Dir1.Path & "\" & File1.FileName)   fsofile.Name = Text2.Text   File1.Refresh End Sub Private Sub Dir1_Change()   File1.Path = Dir1.Path End Sub Private Sub Drive1_Change()   Dir1.Path = Drive1.Drive End Sub Private Sub File1_Click()   Text1.SetFocus   Text1.Text = File1.FileName End Sub Private Sub Form_Load()   Text1.Text = ""   Text2.Text = ""   Dir1.Path = App.Path   Drive1.Drive = App.Path End Sub

このQ&Aのポイント
  • 電話はかけたり受けたり出来るが、話ができない
  • お使いの環境はWindows10で、無線LANで接続されています。
  • 電話回線の種類はひかり回線です。
回答を見る

専門家に質問してみよう