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コードの記述じゃおかしいのでしょうか。
No.5ベストアンサー
- 回答日時:
現象が発生するのはまれでしょうか?
試してみましたがクライアントから連続してconnectすると発生しやすいようです。
ただ、このエラーが発生しても、特に異常が見られないので、このエラーを無視してはどうでしょうか?
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)
If Index = 0 Then ' 受け付けるポートと接続するポートは処理が違う
If Number <> 10035 Then ' エラーコード10035は、無視
Winsock1(Index).Close '接続を閉じる
Do While Not (Winsock1(Index).State = sckClosed)
DoEvents
Loop
On Error Resume Next
Winsock1(Index).Listen
End If
Else
Winsock1(Index).Close '接続を閉じる
Do While Not (Winsock1(Index).State = sckClosed)
DoEvents
Loop
Unload Winsock1(Index)
closedSocks.Add Index
End If
End Sub
返答遅くなり、申し訳ございません。
エラーだからといって、回避ばかりでなく無視する方法もあるのですね。
たいへん勉強になりました。
また、質問を書き込みした時は、よろしくお願いします。
No.4
- 回答日時:
障害を切り分けるために、追加したところをはずすと
32767回までは、ちゃんと動くのですか?
ちゃんと動くのであれば、追加したコントロールを再利用する
ところにおかしいところがあるのではないかと思います。
No.3
- 回答日時:
ConnectionRequestイベントを単純に以下のようにするとどうなりますか?
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
sockNum = sockNum + 1
Load Winsock1(sockNum)
Winsock1(sockNum).LocalPort = 0
Winsock1(sockNum).Accept requestID
End If
End Sub
この回答への補足
毎日お世話になります。
以前の状態ではいただいたソースのまま書いていたのですが、IndexがIntegerなので、32767回の通信でオーバーフローを起こしていた為、今回のソースに書き直したしだいです。これは先日この投稿掲示板に配列について私自身が質問して、教えていただいたもので
http://oshiete1.goo.ne.jp/qa2440588.html
リンクに詳細があります。
No.2
- 回答日時:
1.エラーイベントの以下を削除するとどうなりますか?
On Error Resume Next
Winsock1(Index).Listen
If Winsock1(Index).LocalPort <> 0 Then
Winsock1(Index).LocalPort = 0
2.何をやったときに、エラーが発生しますか?
3.クライアント側の状態はどうなっていますか?
エラーが出ているとか、その場合はエラーの内容は?
この回答への補足
連日の投稿ありがとうございます。
1.エラーイベント以下を削除すると、サーバー側の数字は加算されず止まったままの状態です。
2.最初の一対一の場合は問題ないのですが、2台目や3台目になると止まってしまいます。
3.クライアントは一切エラーは出ません。
エラーを表示させるようにしたら、どうもソケットの処理が終わらないのに、データが来るのが問題のようですが、今日も1日ネットを調べてもそこら辺が理解できずにいます。
また、ご指導お願いします。
No.1
- 回答日時:
状況、質問内容がよくわかりません。
>サーバー側が通信エラーの為か止まってしまいます。
「通信エラーの為か」って、まず通信エラーが発生しているのかどうかもわかっていない?止まるとはどういう状態?
Winsock1_Errorイベントの最初で、Number とDescription をメッセージボックスなどに表示すればどういうエラーが発生しているのか、あるいは、エラーが発生していないのかわかると思いますが。
>On Error Resume Next
エラーを無視しているだけで後でエラーをチェックしていないので、エラーが発生していてもわからない。これを取るとどうなりますか?
>また上記のWinsock1_Errorコードの記述じゃおかしいのでしょうか。
各クライアント用に、サーバのポートを分けているのでしょうか。
Winsockコントロールで、サーバ側のプログラムを作る場合は、VB6.0のSP4以降は必須です。古いバージョンのOCXは、使い物になりません。
この回答への補足
補足要求ありがとうございます。質問の字数制限で上記までしか書けなかったのですが、ゲームを作成していて、サーバー1台に対し10台のクライアントがくっついています。クライアントがゲームをすると、サーバーに点数がアップされ、ゲームに勝つとその中の一部がが払いだされる仕組みになっています。サーバーソフトにはLabelを貼り付け、点数を加算しているのですが、その加算が止まってしまいます。
ご指摘通りにまずVBのSPを確認したところSP2でしたので,SP5にバージョンアップしました。その次にどんなエラーが発生しているか確認を記述したところ、Index0 エラーNo.10035 ソケットはブロッキングを行いません。指定した処理がブロッキングを行います。と表示されました。ずっとブロッキングについて調べているのですが、今のところどのようにしたら良いかわかっておらず、困っております。
On Error Resume Nextについては、取っても変化無く同じ表示を繰り返します。またTCP接続にしているため特にポートの振り分けはしていません。
Private Sub Form_Load()
Set closedSocks = New Collection
Winsock1.Item(0).LocalPort = 1001
Winsock1.Item(0).Listen
End Sub
Private Sub Winsock1_Close(Index As Integer)
Unload Winsock1(Index)
closedSocks.Add Index
End Sub
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
Dim connectsocknum As Integer
If closedSocks.Count > 0 Then
connectsocknum = closedSocks.Item(1)
closedSocks.Remove 1
Text1.Text = sockNum
Text9.Text = closedSocks.Count
Else
sockNum = sockNum + 1
connectsocknum = sockNum
End If
Load Winsock1(connectsocknum)
Winsock1(connectsocknum).LocalPort = 0
Winsock1.Item(connectsocknum).Accept requestID
End If
End Sub
Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Winsock1(Index).GetData dat
n = dat
If n = 1 Then
Label1.Caption = Label1.Caption + 10
y = 1
ans = y
Winsock1.Item(Index).SendData ans
中略
ElseIf n = 7 Then
ans = Label1.Caption
Winsock1.Item(Index).SendData ans
Label1.Caption = 0
End If
End Sub
以上がWinsockのほとんどです。変数の指定や今回質問に入れたエラー部分は入って降りません。初めて作ったソフトのため変数の使い方などがおかしいとかサンプルのまんまとかありますが、またご指導いただける様お願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
このQ&Aを見た人はこんなQ&Aも見ています
-
【お題】NEW演歌
【大喜利】 若い人に向けたことは分かるけど、それはちょっと寄せ過ぎて変になってないか?と思った演歌の歌詞
-
あなたにとってのゴールデンタイムはいつですか?
一週間の中でもっともテンションが上がる「ゴールデンタイム」はいつですか? その逆で、一週間でもっとも落ち込むタイミングでも構いません。 よかったら教えて下さい!
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
プリン+醤油=ウニみたいな組み合わせメニューを教えて!
プリンと醤油を一緒に食べると「ウニ」の味がする! というような意外な組み合わせから、新しい味になる食べ物って色々ありますよね。 あなたがこれまでに試した「組み合わせメニュー」を教えてください。
-
タイムマシーンがあったら、過去と未来どちらに行く?
20XX年、ついにタイムマシーンが開発されました。 あなたは過去に行く? それとも未来? タイムマシーンにのって、どこに行って、何をしたいか教えてください!
-
VB6のwinsockでconnectできない
Visual Basic(VBA)
-
winsockの非同期処理について
C言語・C++・C#
-
ネットワークでの受信バイト数
Visual Basic(VBA)
-
-
4
Winsockを使ってVBでチャットをつくっているのですが・・・
Visual Basic(VBA)
-
5
Winsockで接続待ちタイムアウトを設定する方法
C言語・C++・C#
-
6
rs232cでの受信データ(mscomm)の受信方法VB6
Visual Basic(VBA)
-
7
「&HFFFF」「&H1A」とは?
Visual Basic(VBA)
-
8
VBの「As String * 128」とは?
Visual Basic(VBA)
-
9
Visual Basic 6.0 コンボボックスのChangeイベントが発生しません
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# try-catch でcatchに飛ばす方法
-
winsock通信時エラーの回避
-
FileCopy時のエラー
-
VB6でRDOに接続できない
-
ASPプログラミングでADODB.C...
-
oracleを利用できません。(glob...
-
Outlookで添付ファイルの有無を...
-
ASPでトランザクションをかける...
-
VBSからPDFファイルを開きたい...
-
オーバーフローが発生します
-
WSHでVBScript使いDBのデータを...
-
EXECLマクロでshapeがグルーフ...
-
VBA どうしてなのでしょうか?
-
ASP内で他のASPファイルを読み...
-
Buttonの処理について
-
エクセルVBA 宣言Dimの場所
-
EXCEL VBA API宣言でコンパイル...
-
画面のリフレッシュを意図的に...
-
[PL/SQL]REFCURSORが戻り値のプ...
-
名前が二重に定義されています
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# try-catch でcatchに飛ばす方法
-
FileCopy時のエラー
-
fopenでエラーとなる
-
CreateObject("Excel.Applicati...
-
【C#】アップロード時に「アプ...
-
このページの状態情報は無効で...
-
EXECLマクロでshapeがグルーフ...
-
オーバーフローが発生します
-
エラー 'ASP 0115' について
-
エラー 'ASP 0115'
-
VBSからPDFファイルを開きたい...
-
winsock通信時エラーの回避
-
エラー内容について
-
SPI通信プロトコル
-
Outlookで添付ファイルの有無を...
-
ASP.net の OnClientClick
-
ASP.NETで使用しているJavascri...
-
ADSIについて
-
[VB6.0] Inet OpenURLのエラー検出
-
VBA RemoveDuplicatesで「アプ...
おすすめ情報