UDP接続で2台のコンピュータでチャットをするプログラムを作ってます。
そこで、バインドしたときに相手からの接続がされてるかどうかの確認をする機能をつけたいと思っているのですが良い方法が思いつきません。
何か教えていただけたらと思います。よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

>UDP接続で2台のコンピュータでチャット


2台のPCでのチャットならTCP/IPの方がいいのでは・・・

UDPはエラー処理をしてくれないですけど、そこら辺のロジックも大丈夫ですか?
複数人数同時参加のチャットならUDPで組むと、早くすることも可能だけど、2台ならあまり意味が無いような気がするのは僕だけでしょうか?

参考URL:http://www.microsoft.com/JAPAN/developer/library …
    • good
    • 0
この回答へのお礼

ありがとうございます。UDPとTCPのちがいがはっきりわかっていないところもあったので、今回の回答は大変助かりました。ところでUDPは何の通信にむいてるのでしょうか?

お礼日時:2001/12/18 12:15

>Winsockを使ってVBでチャット


 を作るなら、TAGOSAKU7 さんがおっしゃるように TCP/IPのほうがいいと思います。

なにか他の事情があって、UDPでいくのなら、接続確認はアプリの手順で考えなくてはいけません。
TCP/IPは、「回線を接続する」という概念がありますが、UDPの場合にはありません。(自分のポートではなく、相手も含んだ接続回線と言う意味です)

その辺をふまえて・・・・

>良い方法が思いつきません。
私の場合は、特定のポートを接続確認用に、チャット用とは別にポートを使っています。
チャット参加者テーブルから、相手に対して問合せ文字を送り、また、問合せ文字に対しては、確認文字を返します。
これで、複数の会議形式のチャットができます。
決してベストの方法ではなく、簡易さとか速度のバランスから実践的に使っているという程度です。

#COMポートの結線と似たような考え方です。
    • good
    • 0
この回答へのお礼

あいがとうございます。さっそく参考にさせていただきたいとおもいます。
しかし、UDPはどんな通信にむいているのでしょう?

お礼日時:2001/12/18 12:20

sckClosed 0 (既定値) 閉じています。


WinsockコントロールのStateプロパティで状態がわかります。

参考までに定義と値を載せておきますね。

sckOpen 1 開いています。
sckListening 2 接続要求を待っています。
sckConnectionPending 3 接続がペンディング状態になっています。
sckResolvingHost 4 ホストの解決処理中です。
sckHostResolved 5 ホストの解決が完了しました。
sckConnecting 6 接続処理中です。
sckConnected 7 接続が完了しました。
sckClosing 8 相手側のマシンが接続を閉じようとしています。
sckError 9 エラー。
    • good
    • 0
この回答へのお礼

回答していただきありがとうございました。
UDPにもこの定義を使うことができるのですか。
1度試したのですけどうまくいかないかったのであきらめてましたが、もう一度試してみようと思います。

お礼日時:2001/12/17 16:46

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBのソケット通信(winsock)のサイト

VBでwinsockコントロールを使ってソケット通信にて、データの送受信をするプログラミングをするのですが、サンプルコードなどが載っているサイト、わかりやすく説明してあるサイトがありましたら教えてください。

Aベストアンサー

ここの履歴にサンプルが載ってます。。。
っていうか載せました。

わかりやすいかどうかは、わかりませんが・・・

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=155606

Qwinsock通信時エラーの回避

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コードの記述じゃおかしいのでしょうか。

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 '接...続きを読む

Aベストアンサー

現象が発生するのはまれでしょうか?

試してみましたがクライアントから連続して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

現象が発生するのはまれでしょうか?

試してみましたがクライアントから連続して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 ' 受け付けるポートと...続きを読む

Qexeファイルのセキュリティ。

社内用のメンテナンスプログラムを制作したのですが、同じプログラムで他社の製品にも使えてしまいます。たいした大きさではないので、フロッピーで十分なんですが社外に流失してしまうとこまってしまいます。
IPアドレスで確認すればいいのですが、登録していないようなものはどうしたらよいのでしょうか?
どなたか、教えていただけませんか?

Aベストアンサー

通信認証のサンプルを作成しました。
(正確に言うと、以前に作成したものがあって、それを抜粋しました)

プロジェクトは二つ必要で、サーバーとクライアントに分かれています。
それぞれにプロジェクトを作成して、EXEを作成してください。
基本はサーバーのEXEが立ち上がった状態で、クライアントのEXEを起動してください。
この書き込みの下の方に「共通の標準モジュール」を記してますが、[INIT_PORT][SERVER_NAME]の各定数があります。
こちらは環境に合わせて変更をしてください。
もし、一台のマシンで実験をするのであればSERVER_NAMEをご自分のマシン名に変更をしてください。

プログラムが正常に動くと、サーバー、クライントが交互に通信状況をメッセージボックスで知らせます。
これはあくまでサンプルなのでそのようにしてますが、サーバー側にはメッセージボックスの機能を使用しないでください。メッセージボックスが表示されている間は、他のユーザーとの通信ができなくなってしまいます。
(VBでそれを回避する方法があるのですが、動作が不安定になるために書きません)

このサンプルでは、互いに文字列を送信しています。
実践では、その文字列をパスワード認証に使用してはいかがでしょうか?



必要なもの

Project1.vbp(サーバー用)
フォーム
Winsock1(インデックスなし)
Winsock2(インデックスあり)

Project2.vbp(クライアント用)
フォーム
Winsock1(インデックスなし)

Winsockはメニューバーより
[プロジェクト]
[コンポーネント]
[Microsoft Winsock Control 6.0(かな?)]
を選択したらツールボックスにWinsockコントロールが現れます。
それをサーバー側に二つ、クライアント側に一つ、各フォームに貼り付けます。
サーバー側のWinsock2にはIndexプロパティに'0'ゼロをセットしてください。
その他のWinsockには値を入力しないでください。

あとは下のソースを貼り付けてください。
-----サーバーのフォーム内のソース(ここから)---------
Option Explicit

Private Sub Form_Load()
  Me.Caption = "SERVER"

  'ポートの初期化を行い、受信待ち状態にする
  On Error GoTo PGMERR
  
  With Me.Winsock1
    .LocalPort = INIT_PORT
    .Listen
  End With
  
  Exit Sub
  
PGMERR:
  Call MsgBox("通信ポートに以上が見られました、終了いたします。", vbSystemModal, Me.Caption)
  End
End Sub

'フォームが閉じる前に、Winsockを全て閉じる
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  Dim wkSock As Winsock
  
  With Me
    .Winsock1.Close
    For Each wkSock In .Winsock2
      wkSock.Close
    Next wkSock
  End With
End Sub

'特定のクライアントのソケットを閉じたとき
Private Sub Winsock2_Close(Index As Integer)
  With Me
    .Winsock2(Index).Close
    Unload .Winsock2(Index)
  End With
End Sub

'メッセージデータの受信
Private Sub Winsock2_DataArrival(Index As Integer, ByVal bytesTotal As Long)
  Dim strRecvData As String    '送られてきたデータ
  Dim lngRecvCnt As Long     '送られてきたデータライン数
  Dim valRecvAry As Variant   '送られてきたデータをライン数のに分解し配列にして記憶
  
  Dim wkVal    As Variant   '受信したメッセージ1文を、IDとメッセージに分解して配列で記憶
  Dim wkSType   As SOCKMSG_ID  '分解した1文のID
  Dim wkStr    As String    '分解した1文のメッセージ
  
  Dim i      As Long     'ループカウンタ
  
  Dim wkMsg    As String    '送信するメッセージ
  
  With Me
  
    'メッセージを受け取る
    .Winsock2(Index).GetData strRecvData
    
    '受信メッセージを、メッセージ分の配列にする
    valRecvAry = Split(strRecvData, vbCrLf)
    
    'メッセージ数を取得
    lngRecvCnt = UBound(valRecvAry)
    
    '受信メッセージの分だけ、一文ずつ処理を行う
    For i = 0 To lngRecvCnt - 1
    
      '一文をIDとメッセージに分解
      wkVal = Split(valRecvAry(i), vbNullChar)
      wkSType = wkVal(0)
      wkStr = wkVal(1)
      
      Select Case wkSType
        Case SOCKMSG_ID.ID1
          wkMsg = "山川豊"
          Call MsgBox("ID1で[" & wkStr & "]を受信しました" & vbNewLine & vbNewLine _
            & "ID1で[" & wkMsg & "]を送信します", vbSystemModal, Me.Caption)
          Call SendMsg(.Winsock2(Index), ID1, wkMsg)
          
        Case SOCKMSG_ID.ID2
          wkMsg = "起動してもいいよ"
          Call MsgBox("ID2で[" & wkStr & "]を受信しました" & vbNewLine & vbNewLine _
            & "ID2で[" & wkMsg & "]を送信します", vbSystemModal, Me.Caption)
          Call SendMsg(.Winsock2(Index), ID2, wkMsg)
      
      End Select
    Next i
  End With
PGMEND:
End Sub

'接続要求がきたら、新たなWinsockを用意する
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
  Dim lngNewIndex As Integer
  
  lngNewIndex = 0
  On Error Resume Next
  
  With Me
    '新たな受信装置を1つ追加する
    Do
      Err.Clear
      lngNewIndex = lngNewIndex + 1
      Load .Winsock2(lngNewIndex)
    Loop Until Err.Number = 0&
    On Error GoTo 0
    
    .Winsock2(lngNewIndex).Accept requestID
  End With
End Sub
-----サーバーのフォーム内のソース(ここまで)---------

-----クライアントのフォーム内のソース(ここから)-------
Option Explicit

'フォームロード時に接続を試みる
Private Sub Form_Load()
  Me.Caption = "CLIANT"

  With Me.Winsock1
    .RemoteHost = SERVER_NAME
    .RemotePort = INIT_PORT
    .LocalPort = 0
    .Connect
  End With
End Sub

'サーバーが落ちた
Private Sub Winsock1_Close()
  Call MsgBox("サーバーが落ちたー", vbSystemModal, Me.Caption)
  Unload Me
End Sub

'サーバーと接続できた
Private Sub Winsock1_Connect()
  Dim wkMsg  As String
  
  wkMsg = "岸部四郎"
  
  Call MsgBox("接続できた" & vbNewLine & vbNewLine _
      & "ID1で[" & wkMsg & "]を送信します", vbSystemModal, Me.Caption)
  Call SendMsg(Me.Winsock1, ID1, wkMsg)
End Sub

'サーバーと接続できなかった
Private Sub Winsock1_Error(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)
  Call MsgBox("接続できなかった", vbSystemModal, Me.Caption)
  Unload Me
End Sub

'メッセージデータの受信
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  Dim strRecvData As String    '送られてきたデータ
  Dim lngRecvCnt As Long     '送られてきたデータライン数
  Dim valRecvAry As Variant   '送られてきたデータをライン数のに分解し配列にして記憶
  
  Dim wkVal    As Variant   '受信したメッセージ1文を、IDとメッセージに分解して配列で記憶
  Dim wkSType   As SOCKMSG_ID  '分解した1文のID
  Dim wkStr    As String    '分解した1文のメッセージ
  
  Dim i      As Long     'ループカウンタ
  
  Dim wkMsg    As String    '送信するメッセージ
  
  With Me
  
    'メッセージを受け取る
    .Winsock1.GetData strRecvData
    
    '受信メッセージを、メッセージ分の配列にする
    valRecvAry = Split(strRecvData, vbCrLf)
    
    'メッセージ数を取得
    lngRecvCnt = UBound(valRecvAry)
    
    '受信メッセージの分だけ、一文ずつ処理を行う
    For i = 0 To lngRecvCnt - 1
    
      '一文をIDとメッセージに分解
      wkVal = Split(valRecvAry(i), vbNullChar)
      wkSType = wkVal(0)
      wkStr = wkVal(1)
      
      Select Case wkSType
        Case SOCKMSG_ID.ID1
          wkMsg = "鳥羽一郎"
          Call MsgBox("ID1で[" & wkStr & "]を受信しました" & vbNewLine & vbNewLine _
            & "ID2で[" & wkMsg & "]を送信します", vbSystemModal, Me.Caption)
          Call SendMsg(.Winsock1, ID2, wkMsg)
          
        Case SOCKMSG_ID.ID2
          Call MsgBox("ID2で[" & wkStr & "]を受信しました" & vbNewLine & vbNewLine _
            & "通信を終了します", vbSystemModal, Me.Caption)
          
          '''''ここに通信が正常にできたことを示すフラグを立てておく
          Unload Me
      End Select
    Next i
  End With
PGMEND:
End Sub
-----クライアントのフォーム内のソース(ここまで)-------

サーバー・クライアントのそれぞれに共通の標準モジュールとして、以下のソースを追加してください。
-----共通の標準モジュール(ここから)-------
Option Explicit

Public Enum SOCKMSG_ID
  ID1 = 1
  ID2 = 2
  ID3 = 3
End Enum
Public Const INIT_PORT As Long = 8000 '←このPORTは使用される確立が高いので、適当な値に変更したほうがいいかも?
Public Const SERVER_NAME As String = "PC_MACHINE_NAME" '←サーバー用のEXEのをおくマシン名

Public Sub SendMsg(inSock As Winsock, inSendType As SOCKMSG_ID, inSendMsg As String)
  Dim wkStr  As String
  
  With inSock
    '通信が可能なときに通信する
    If (.State = (sckConnected)) Then
      '通信の書式は
      ' 1.通信を送るときのID(SOCKMSG_IDを自分で作成、オリジナルの番号を振る)
      ' 2.vbNullChar(IDとメッセージとの区切り文字)
      ' 3.メッセージ(任意の文字列)
      ' 4.vbCrLf(文末を示す)
      wkStr = inSendType & vbNullChar & inSendMsg & vbCrLf
      
      'メッセージを送る
      .SendData wkStr
    End If
  End With
End Sub
-----共通の標準モジュール(ここまで)-------

通信認証のサンプルを作成しました。
(正確に言うと、以前に作成したものがあって、それを抜粋しました)

プロジェクトは二つ必要で、サーバーとクライアントに分かれています。
それぞれにプロジェクトを作成して、EXEを作成してください。
基本はサーバーのEXEが立ち上がった状態で、クライアントのEXEを起動してください。
この書き込みの下の方に「共通の標準モジュール」を記してますが、[INIT_PORT][SERVER_NAME]の各定数があります。
こちらは環境に合わせて変更をしてください。
もし、一台のマ...続きを読む

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

QWinsockで接続待ちタイムアウトを設定する方法

現在、WinsockAPIを使ってソケット通信プログラムを作っています。
 このプログラムの仕様の中で、接続待ちタイムアウトというものがあります。これはつまり、connect関数を実行してから応答が返ってくる(関数が値を返す)までの時間監視のことなのですが、そのような値をソケットに対して設定する手段というのはあるのでしょうか?

Aベストアンサー

あるとすれば、
setsockopt()
で設定できるソケットオプションのどれかということになります。
明確に書かれているものはありませんが、もしかすると、送信タイムアウトの設定で効いてくるかも知れません。

なければ、
(1)ソケットをノンブロッキングにして、
(2)connect()の完了を、タイマを掛けることのできるselect()で待ち、
(3)自分のタイムアウトが先にやってきたら、ソケットを捨てて、タイムアウト処理をする。
connect()の結果がタイムアウトで完了してもなお自分のタイマに残りがあれば、残り時間分のタイマを掛けて(2)に戻る。
というような実装になるように思います。

回答になっておりませんが、参考まで。

QWinsockコントロールの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

などというふうに書いています。

よろしくお願いします。

VisualVasic 6.0 Professional Edition (SP 5)を使用しています。

WinsockコントロールのErrorイベントに関する質問です。このイベントでエラーを出したいと思っているのですが、
オーバーフローしてしまい、うまくいかず困っています。

MSDNライブラリの説明では、

object_Error(number As Integer, _
Description As String, _
Scode As Long, (以下略)

というふうになっていて

numberの説明は、「エラー コードが整数で渡されます。
返される値については、次の「設定値」を参照してくださ...続きを読む

Aベストアンサー

たぶん、エラーコードは符号なし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

たぶん、エラーコードは符号なし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
UnsignedShort2Lon...続きを読む

QWinsockで、localhostに接続時、10061エラー、コンピューター名ならOk

VB6.0(SP5)で、TCP/IPの通信を作成しています
開発環境は、Windows2000(SP4)
実行環境は、WindowsXP Home(sp2)です

Winsockコントロールに以下の値を設定していますが接続時にエラー:WSAECONNREFUSED 10061 Connection refusedを返します

.LocalPort = 0
.RemoteHost = "localhost"
.RemotePort = 2010
.Connect
(.RemoteHost = "127.0.0.1"でも同じです)

しかし、
.RemoteHost = "192.168.0.110" 自身のIPアドレス
.RemoteHost = "COMP01" 自身のコンピューター名
を指定した場合エラーとなりません

何かアドバイスを頂ければお願いします

Aベストアンサー

接続しようとしているサーバーも自作でしょうか?
だとしたら,そのサーバーがlocalhostに対してサービスを提供していないのでしょう.
TCP/IPサーバは,サーバのIPアドレスを指定することもできますししないこともできます.
アドレスを指定しなければ,そのマシンが持っている全てのIPアドレスでサービスを提供します(ご質問のマシンの例では,192.168.0.110と127.0.0.1ですね.サーバー側IPアドレスを指定してしまった場合は,そのアドレス限定でサービスを提供します.というわけで,192.168.0.110の2010番ポートだけ待ち受けている状況で127.0.0.1に接続しようとするとconnection refusedになります.

あとは,パーソナルファイヤウォールなどの設定の影響という可能性もありますが.

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

現在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を使うのは初めてなので勝手がわからなく苦戦中です
どなたかわかる方、お返事お待ちしています

現在LANで接続されたプリンタに文字列を印字させるプログラムを作成しているのですが、プリンタ側のIPアドレス、使用するポート(今回は1024という指定があったのでそれに設定)を設定し、印字処理をはしらせたのですが、そこでエラーが発生してしまいます。簡略化していますが、プログラムは

Private sckWinsock As Winsock

Set sckWinsock = Winsock1

sckWinsock.Protocol = sckTCPProtocol
sckWinsock.RemoteHost = "192.168.0.***"
sckWinsock.RemotePort = 1024
sckWinsock.LocalPort = 0

sck...続きを読む

Aベストアンサー

APIを使用するとできます。
ただ、使い慣れるまでちょっと大変かも・・

ちょっと検索したら、以下のところにサンプルが
ありました。

winsock api なんかで検索してみてください。
ほとんどがC言語用にかかれているものばかりですけど。
がんばってください。

参考URL:http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/9802/winsock/

Qソケット通信 同じポート番号でn対1はできない?

Windows2000クライアントが複数あり、サーバソケット用APを作成したのですが、1対1では確認できたのですが、
n対1は、手法が変わるのですか?

疑問:
PCとサーバ間でのソケット通信にて、相互に同じポートでなければいけないので、複数のPCからサーバソケット用AP
で決めたポートに繋げに行くことが可能なのですか?

Aベストアンサー

サーバのOSについての記述がないので、unix系とみなして回答します。
APを以下のように修正してください。

accept()したあと、fork()します。

親はaccept()で得たディスクリプタをclose()して再度accept()ループに入ります。

子はbind()で得たディスクリプタをclose()して、あとは1体1の場合と同様に通信を開始し、処理が終了したらexit()します。

fork()によって、接続を待つプロセスと受け付けた接続を処理するプロセスに別れることで、複数の接続を同時に受け入れ可能なサーバAPを作成します。

MTによる方法もありますが、まずはfork()をマスターしてください。

QVB6.0-整数と余りを求める

表題の通り、整数と余りを求める関数を教えてほしいです:例:100/60=1余り40
整数:1
余り:40
よろしくお願いいたします。

Aベストアンサー

Dim A,B,C,D as integer
A=100
B=60
C=Int(A/B) <---答は1
D=A mod B

●IntはAをBで割った時の整数部分を求める関数ですが、答が負の場合は
注意が必要です。 例 Int(-100/40)=-2
これを回避する場合 Fixがいいです

●mod は A を B で割った時の余りを求める関数


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報