mehrere verbindungen mit Winsock

  • #1
K

killer-Trekkie

Bekanntes Mitglied
Themenersteller
Dabei seit
28.10.2003
Beiträge
145
Reaktionspunkte
0
Servus,

Wie kann ich mit Winsock-Serverprogramm zu mehreren Clients eine Verbindung aufbauen um z.B. Sachen zu senden (nicht als Chatprogramm oder Nachrichtensender)? Geht das überhaupt über TCP oder muss es über UDP gehen (hab es schon über UDP hinbekommen, konnte aber z.B. Nachrichten nicht an ALLE senden)?

Vielen Dank für eure Hilfe.
 
  • #2
Server definiert sich übrigens so, das ein Server auf Verbindungsanfragen wartet und ein Client ist der Rechner der eine Verbindung zu einem Server aufbauen soll.

Dein Server (eigendlich Client) baut ein Kontakt zu einem Client (eigendlich Server) auf. Damit ist diese Instanz des Ws- OCX belegt. Du kannst aber im Programmcode des Clients (eigendlich Server) ja eine neue Instanz erstellen; in dem Ereigniss ws_connect (Load Winsock1(iVerbindungsanzahl).

Broadcastmeldungen gehen scheinbar nicht.
 
  • #3
Code:
Private Sub Winsock_Connect()
    load Winsock(4)
End Sub

So? Oder muss man noch was deklarieren?

mfg

killer-Trekkie
 
  • #4
1. Ziehe ein ws- ocx auf das Formular.
2. Markiere dies.
3. Drücke strg+V und strg+C
4. Es erscheint eine Meldung (wollen Sie ein Steuerelementefeld erstellen). Dies mit ja beantworten.
5. Das neu erstellte Winsock- ocx wieder löschen.

EDIT: Ein Steuerelementefeld lässt sich auch einfacher erstellen indem man die Eigenschaft Index des vorhandenen Steuerelementes auf 0 setzt.


Nun bekommt das Ereignis beim Aufruf als Parameter den Index übergeben.
Code:
Private Sub Winsock_Connect(index as integer)
Mit
Code:
load winsock(4)
klappts auch nicht

Code:
Dim iVerb as integer

Private Sub Winsock_Connect(index as integer)
     iVerb=iVerb+1
    load Winsock(iVerb)
End Sub

Private sub Winsock_close(index as integer)
     iVerb=iVerb-1
     unload winsock(index)
end sub
 
  • #5
Geht nicht!!!!

Eine Verbindung wird aufgebaut, aber bei der zweiten kommt ein Error (err.Number=0; err.Description kommt keine).
Ich benutze TCP. Kann es vielleciht an Winsock.listen liegen?

Der Server:
Code:
Option Explicit
    Private iVerb As Integer

Private Sub Form_Load()
    Winsock(iVerb).Listen
End Sub

Private Sub Winsock_Close(Index As Integer)
    Winsock(iVerb).Close

    Do
        DoEvents
    Loop Until Winsock(iVerb).State = sckClosed

    Winsock(iVerb).Listen

    Label1 = Warte auf eine Verbindung
End Sub

Private Sub Winsock_Connect(Index As Integer)
    iVerb = iVerb + 1
    Load Winsock(iVerb)
End Sub

Private Sub Winsock_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    If Winsock(iVerb).State <> sckClosed Then Winsock(iVerb).Close
    Winsock(iVerb).Accept requestID

    Label1 = Eine Verbindung wurde hergestellt

    List1.AddItem requestID
End Sub

Der Client
Code:
Private Sub Command1_Click()
    Winsock.RemoteHost = 192.168.0.1
    Winsock.RemotePort = 6687
    Winsock.Connect

    Do
        DoEvents
        If Winsock.State = sckError Then
            MsgBox Err.Number &   & Err.Description
        End If
    Loop Until Winsock.State = sckConnected Or Winsock.State = sckError

    If Winsock.State = sckConnected Then
        Label1 = Connected
    Else
        Label1 = Error
    End If
End Sub

Private Sub Command2_Click()
    Winsock.Close

    Do
        DoEvents
    Loop Until Winsock.State = sckClosed
    Label1 = Closed
End Sub

Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)
    Dim Nachricht As String
    Winsock.GetData Nachricht

    Label2 = Nachricht
End Sub

Wo ist der Fehler??????
 
  • #6
Habs nochmal leicht abegeändert, so sollte es klappen. Zur Fehlerbehandlung hat das Winsock- ocx übrigens ein eigenes Error- Ereigniss.


Code:
'Server
Option Explicit
    Private iVerb As Integer

Private Sub Form_Load()
    Winsock(iVerb).Listen
End Sub

Private Sub Winsock_Close(Index As Integer)
    Winsock(iVerb).Close

    Do
        DoEvents
    Loop Until Winsock(iVerb).State = sckClosed

    Winsock(iVerb).Listen

    Label1 = Warte auf eine Verbindung
End Sub

Private Sub Winsock_Connect(Index As Integer)
   ->iVerb = iVerb + 1
   ->Load Winsock(iVerb)
   ->Winsock(iVerb).LocalPort = 0
End Sub

Private Sub Winsock_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    iVerb = iVerb + 1
    Load Winsock(iVerb)
    Winsock(iVerb).LocalPort = 0
    
    
    If Winsock(iVerb).State <> sckClosed Then Winsock(iVerb).Close
    Winsock(iVerb).Accept requestID

    Label1 = Eine Verbindung wurde hergestellt

    List1.AddItem requestID
End Sub

Code:
'Client


Private Sub Command1_Click()
    Winsock.RemoteHost = 192.168.0.100
    Winsock.RemotePort = 6687
    Winsock.Connect

    Do
        DoEvents
        If Winsock.State = sckError Then
            MsgBox Err.Number &   & Err.Description
        End If
    Loop Until Winsock.State = sckConnected Or Winsock.State = sckError

    If Winsock.State = sckConnected Then
        Label1 = Connected
    Else
        Label1 = Error
    End If
End Sub

Private Sub Command2_Click()
    Winsock.Close

    Do
        DoEvents
    Loop Until Winsock.State = sckClosed
    Label1 = Closed
End Sub

Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)
    Dim Nachricht As String
    Winsock.GetData Nachricht

    Label2 = Nachricht
End Sub

Private Sub Winsock_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)
MsgBox (Description)
End Sub
 
  • #7
Eine Verbindung wird aufgebaut und Akzeptiert, aber wenn ich versuche von einem dritten rechner eine zweite Verbindung zum Serverprogramm herzustellen kommt eine Fehlermeldung in der Steht, dass die Herstellung einer Verbindung absichtlich verhindert wird. Wie kann ich das umgehen?

mfg

killer-Trekkie
 
  • #8
Das funktioniert. Habs selber getestet. Die Codezeilen im Ereigniss Winsock_Connect sind auskommentiert und im Ereignis Winsock_ConnectionRequest untergebracht.
 
  • #9
Coll, jetzt gehts, aber um auf meine ursrüngliche Frage zuruckzukommen: Wie kann ich jetzt eine Nachricht an alle Clients senden (an einen geht)?

mfg

killer-Trekkie
 
  • #10
Wie wäre es denn mit ner' Schleife???

For i = 1 to iVerb
winsock(i).SendData strData
next i
 
  • #11
Ups, ach ja. Ich denke, dass meine Fragen jetzt beantwortet wurden.
Vielen, vielen Dank.

mfg

killer-Trekkie
 
  • #12
Hi Killer

Sind wir nun eigendlich fröhlicher Besitzer einer MSDN Libary?
 
  • #13
Bin dabei sie mir zu besorgen.
 
Thema:

mehrere verbindungen mit Winsock

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.840
Beiträge
707.963
Mitglieder
51.494
Neuestes Mitglied
Flensburg45
Oben