[VB] Winsock socket gebruiken

Pagina: 1
Acties:

  • ddkiller0900
  • Registratie: Juli 2001
  • Laatst online: 13:18
Ik heb mijn chat bijna af, der is maar één probleem. Er kunnen er maar twee tegelijk chatten :?
De server en de client dan.
Maar ik wil eigenlijk met meerdere, maar dan geeft die een fout. Ik heb begrepen dat je dan sockets moet gaan gebruiken.
Dus het zou zoiets moeten worden dat die meerdere sockets accepteert. Heb nu het volgende :


Private Sub Server_ConnectionRequest(ByVal requestID As Long)

If Server.State <> sckClosed Then Server.Close
Server.Accept requestID

End Sub

Private Sub Server_DataArrival(ByVal bytesTotal As Long)

Server.GetData a$, vbString

If a$ = "end" Then
Server.Close
Server.Listen
a$ = "Client heeft de verbinding verbroken"
End If

berichtvenster.AddItem a$
berichtvenster.ListIndex = berichtvenster.ListCount - 1

End Sub


dit is dus het gedeelde waar iets in verander zou moeten worden zodat die meerdere connecties accepteerd. Iemand een idee. Ik zou zo blij zijn als ik dat had, dan kan ik de rest gaan afwerken.

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

we missen te veel code om er hier echt iets van de maken...

Het idee achter meerdere verbindingen is:

Listen (1)
verbinding wordt tot stand gebracht (1)
Listen (2)
.....
close(1)


Als je namelijk een verbinding aanneemt, moet je wel weer gaan luisteren of er een nieuwe verbinding komt...

Localhost, sweet localhost


  • ddkiller0900
  • Registratie: Juli 2001
  • Laatst online: 13:18
ja weet ik, ik zal wat zoeken op internet, kijken of ik wat vind, ik laat weten als het gelukt is.

  • barber
  • Registratie: Oktober 2001
  • Niet online
Op zaterdag 29 december 2001 23:28 schreef ddkiller0900 het volgende:

Private Sub Server_ConnectionRequest(ByVal requestID As Long)

If Server.State <> sckClosed Then Server.Close
Server.Accept requestID

End Sub
Je laat nu de socket die luistert naar nieuwe clients de verbinding accepteren. Je moet de Server socket alleen laten luisteren en als er een verbinding is deze met een andere socket laten accepteren en dan deze andere socket gebruiken voor de communicatie, zodat de Server socket weer kan gaan luisteren voor nieuwe verbindingen.

Private Sub Server_ConnectionRequest(ByVal requestID As Long)

'hier dus bijvoorbeeld kijken of je andere socket vrij is voor een verbinding en zo niet sluiten
If sckClient.State <> sckClosed Then sckClient.Close
sckClient.Accept requestID

End Sub

Je zou dus in die functie kunnen kijken welke van je sockets bedoeld om met clients te verbinden er vrij is en die dan te gebruiken.
De socket Server gebruik je alleen maar om te luisteren voor nieuwe verbindingen.

  • ddkiller0900
  • Registratie: Juli 2001
  • Laatst online: 13:18
hier dit probeer ik uit. Dan gebruik ik 1 control en meerdere inkomende verbindingen:


Server(intConnection).Accept requestID

maar, ik heb voorbeelden bekeken, en als je dan server typt dan laat hij nog andere attributen zien , dus eigenlijk dat je nog meer achter Server kan zetten, maar als ik Server(intConnection).Accept requestID gebruik als code ipv Server.Accept requestID dan geeft ie een fout als er iemand probeert te verbinden. :?
Vind het vreemd, het is juist alsof ik dat kenmerk (intConnection) niet kan toewijzen :?

  • ddkiller0900
  • Registratie: Juli 2001
  • Laatst online: 13:18
hij geeft dan volgende fout:
wrong number of arguments or invalid property assignment

moet ik soms nog iets instellen zodat ie dat argument kan gebruiken??

  • barber
  • Registratie: Oktober 2001
  • Niet online
Op zondag 30 december 2001 01:31 schreef ddkiller0900 het volgende:
hier dit probeer ik uit. Dan gebruik ik 1 control en meerdere inkomende verbindingen:


Server(intConnection).Accept requestID

maar, ik heb voorbeelden bekeken, en als je dan server typt dan laat hij nog andere attributen zien , dus eigenlijk dat je nog meer achter Server kan zetten, maar als ik Server(intConnection).Accept requestID gebruik als code ipv Server.Accept requestID dan geeft ie een fout als er iemand probeert te verbinden. :?
Vind het vreemd, het is juist alsof ik dat kenmerk (intConnection) niet kan toewijzen :?
Je moet dus meer dan 1 winsock control gebruiken.
1 winsock control om te luisteren naar verbindingen.
En 1 of meer winsock controls om een verbinding te acepteren in de ConnectionRequest event van de winsock control wat luistert naar verbindingen.

Het is een tijdje geleden dat ik met VB te maken had, maar er stond altijd een compleet chat programma als voorbeeld op de msdn cd's van microsoft. Het zal vast ook wel op de site van msdn staan. http://msdn.microsoft.com/library/default.asp

  • ddkiller0900
  • Registratie: Juli 2001
  • Laatst online: 13:18
bedankt, jij hebt mij het ff goed uitgelegd, nu weet ik wat er precies bedoeld wordt. :)

  • ddkiller0900
  • Registratie: Juli 2001
  • Laatst online: 13:18
vindhet best wel vreemd hoor, in andere voorbeeldprogramma's zie ik dat ze maar 1 control gebruiken :?
Maar ja, dan zie je wel dat ze die anders gebruiken.
Dus bv, winsock
en dan gebruiken ze winsock(0) en dat werkt dan weer niet

  • barber
  • Registratie: Oktober 2001
  • Niet online
heb ff google gebruikt voor je.
Hier staat een voorbeeld van een Multi-User Chat Client and Server:
http://www.gamedev.net/reference/articles/article1314.asp

  • ddkiller0900
  • Registratie: Juli 2001
  • Laatst online: 13:18
Ik heb nog eens gekeken, het hoort met 1 control te gaan.
Maar wat ik niet snap is.

Bij al die voorbeeldproggies doen ze het volgende:
winsock control erin en noemen die bv winsock

Dan roepen ze in hun Form_load die als volgt aan:

Winsock(0).LocalPort = 55
Winsock(0).Listen

nou, dat werkt dus niet bij mij
bij hun geeft die nadat ze Winsock( hebben getypt het volgende weer (die help van vb dus):
Item(integer) as Winsock

Als ik het doe gebeurt er niks, en dan werkt het ook niet. Dit is het enige wat ik moet weten, dan is mijn proggie af
Wie kan mij helpen ??? ;( ;( ;( ;(
Dan zal ik weer rustig kunnen :Z :Z :Z


Zetten ze die Winsock control er op een bepaalde manier in?? Ik heb in het voorbeeld proggie die control eruit gehaald en daarna zelf weer die control erin gezet, naam weer juist gezet, en je raadt het al, hij werkt dan niet :?

  • barber
  • Registratie: Oktober 2001
  • Niet online
Op zondag 30 december 2001 02:28 schreef ddkiller0900 het volgende:
Ik heb nog eens gekeken, het hoort met 1 control te gaan.
Als er meerdere clients tegelijk moeten verbinden, dan moet je meerdere controls gebruiken. (Kan in een array zijn)
Maar wat ik niet snap is.

Bij al die voorbeeldproggies doen ze het volgende:
winsock control erin en noemen die bv winsock

Dan roepen ze in hun Form_load die als volgt aan:

Winsock(0).LocalPort = 55
Winsock(0).Listen
Ze gebruiken een array van controls.
Winsock(0) is dan de eerste winsock control in de array van winsock controls.

Hier een stukje uit de pagina die ik al eerder genoemd heb:
Make sure you create a control array for the Winsock control on the server. Do this by typing "0" in the "index" field of the Server Winsock Control properties.

Bekijk de pagina die ik je al eerder genoemd heb, daar staat het echt allemaal in:
http://www.gamedev.net/reference/articles/article1314.asp

  • ddkiller0900
  • Registratie: Juli 2001
  • Laatst online: 13:18
ok, goed dat je dat stukje tekst daar vernoemd, nu weet ik hoe ik verder moet. Je hebt me goed geholpen. Bedankt! :)

Verwijderd

in het grote msdn staat een stukje hier over en asl je ff de search gebruik zul je hier ook veel over vinden. /me =-]heeft het vroeger zelf ook wel eens gemaakt. maar uuh post je exe file eens? kijken of het wat is

  • BOOTZ
  • Registratie: Maart 2001
  • Laatst online: 09:54
ik heb ooit es een irc server geschreven, gebruikte deze code:

(eerst ff een winsock control op je form plakken, en bij de properties daarvan bij 'index' een '0' invullen
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
dim wsklast as integer

private sub form1_load
for a=1 to 200
load winsock1(a)
next a
winsock1(0).listen
end sub

private sub winsock1_connectionrequest(byval requestid as long, byval index as integer)
if wsklast>200 then exit sub
wsklast=wsklast+1
winsock1(wsklast).accept(requestid)
end sub

zo luistert dus winsock1(0), en hij laat telkens een andere winsock control de verbinding accepten, waardoor ie zelf kan blijven luisteren.

Maak je eigen poll


Verwijderd

Op maandag 31 december 2001 10:47 schreef BOOTZ het volgende:
zo luistert dus winsock1(0), en hij laat telkens een andere winsock control de verbinding accepten, waardoor ie zelf kan blijven luisteren.
Tweetal opmerkingen:
- Je gooit bijvoorbaat al 200 winsocks de lucht in, wellicht kan je daarmee wachten totdat er werkelijk een client connect.
- Na 200 connecties stopt je programma (???). Je zou hier eigenlijk alle winsocks moeten doorlopen en de eerste die nog openstaat (.State<>sckConnected) laten accepten.
Pagina: 1