[VB6] Winsock Accept buiten Connection request?

Pagina: 1
Acties:

  • danslo
  • Registratie: Januari 2003
  • Laatst online: 10-04 19:55
Goedendag :P Ik ben laatst bezig geweest om voor een programma een proxifier te maken, dit gaat eigenlijk heel simpel te werk (heb het ook al voor een ander programma gemaakt).. Je VB6 programma luistert lokaal op de poort waar de remoteserver eigenlijk op draait, je client connect naar het programma, wanneer er in je programma een connection request binnenkomt, connect je naar de remoteserver. (allereerst dus wel het remote ip in je hosts file aanpassen naar localhost). Zo kan je dus heel effectief data uit packets halen en desnoods aanpassen.

Ok, nu heb probleem, op het moment gaat het zo:

Client connect naar proxy,
Proxy connect naar remote server.

Client zend data naar proxy,
proxy zend data naar remote server.
Remote server zend data naar proxy,
proxy zend data naar client.

Dit gaat middels onderstaande code: Als de client socket een request krijgt, wordt hij geaccepteerd te connecten en wordt er direct naar de remote server een connectie gemaakt.
code:
1
2
3
4
5
6
7
8
Private Sub wSClient_ConnectionRequest(ByVal requestID As Long)
    
    wSServer.Connect remHost, remPort
    
    If wSClient.State <> sckClosed Then wSClient.Close
    wSClient.Accept requestID
    
End Sub

Overigens heet het winsock control dat remote connect wSServer.
Nu moeten we natuurlijk data die we binnenkrijgen van de client, doorsturen via het wSServer socket control:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub wSClient_DataArrival(ByVal bytesTotal As Long)

    wSClient.GetData strData
    strData = cv_HexFromString(strData)
    ProcessClientData (strData)
    
End Sub

Private Sub ProcessClientData(data As String)

    wSServer.SendData cv_StringFromHex(data)
    
End Sub


Wat nu uiteindelijk het probleem is, omdat de proxy local is, wordt er door de client enorm snel een verbinding gemaakt. Dit zorgt ervoor dat die meteen data begint te versturen, zonder dat mijn remote server control geconnect is! Overigens is connecten naar de remote server bij form load in mijn applicatie geen optie.

Nu heb ik dit geprobeerd op te lossen om mijn winsock accept pas uit te voeren als de remote server geconnect is(Private Sub wSServer_Connect()), maar dan krijg ik errors 'The descriptor is not a socket' oid. Oftewel, ik kan Accept niet uitvoeren buiten wSClient_SocketRequest, ook niet als ik requestID public define.

Enig idee hoe ik dit oplos? Alvast bedankt.

  • danslo
  • Registratie: Januari 2003
  • Laatst online: 10-04 19:55
edit:
Grrr... quote ipv edit... sorry

[ Voor 97% gewijzigd door danslo op 16-02-2006 19:30 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 08-04 12:26
Je kunt toch in je connection_request een verbinding proberen op te bouwen naar de server, en wachten totdat je een connected event krijgt ( met een vlag oid ) ?

Een andere mogelijkheid is ( als je weet hoe het protocol die je client gebruikt eruit ziet ) een response teruggeven die aangeeft dat de server nog niet klaar is. Dit zou dan wel in het protocol mogelijk moeten zijn.

Mooi is het niet maar als je sockets mooi wilt doen gebruik dan liever geen VB :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • danslo
  • Registratie: Januari 2003
  • Laatst online: 10-04 19:55
Ik denk niet dat je me helemaal begrijpt :) Ik maak op het moment ook een verbinding naar de remote server met server socket bij de connection_request op de client socket, het probleem is alleen dat ik ALLEEN in die connection_request, ook mijn client moet accepten om te laten connecten, dit kan dus niet in die connected event van de server socket ;)

  • danslo
  • Registratie: Januari 2003
  • Laatst online: 10-04 19:55
Afbeeldingslocatie: http://members.lycos.nl/dumpdumpdump/bla.jpg

Zoiets moet je aan denken ;) Alleen nu is die "remote connection" dus zo langzaam terwijl de client al denkt dat hij geconnect is (die connect dus naar de proxy) en hij al data begint te versturen :)

  • Glashelder
  • Registratie: September 2002
  • Niet online

Glashelder

Anti Android

Kan je niet een buffer opbouwen? Dus de ontvangen data gewoon wegschrijven in een temp mapje (of een array), de remote connectie opbouwen en gewoon doorsturen. Die client wacht wel als die klaar is waarschijnlijk..

Overigens kan je ook eens een kijkje nemen naar een Control Array.

[ Voor 15% gewijzigd door Glashelder op 17-02-2006 15:31 ]

PV 4915wp op oost, 2680 wp op west, 1900 wp op zuid. pvoutput - AUX 8 kW bi bloc


  • danslo
  • Registratie: Januari 2003
  • Laatst online: 10-04 19:55
Nouja wegschrijven naar een buffer lijkt me een van de laatste oplossingen, de kracht van de proxy is juist dat alles direct wordt weggestuurd en je de data zo nodig nog kan editen bij bepaalde packets.

Mijn slotvraag dan maar: Ís er uberhaupt wel een manier om buiten een connection request sub, de connection te accepten?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 08-04 12:26
Achja, VB is niet echt multithreaded :O

Maar een buffer opbouwen is dan geen slecht plan: je hoeft alleen een buffer op te bouwen op het moment dat je niet weg kunt met de data.
Mijn slotvraag dan maar: Ís er uberhaupt wel een manier om buiten een connection request sub, de connection te accepten?
Nee, dat id is alleen geldig in het connection_request event

[ Voor 37% gewijzigd door farlane op 17-02-2006 19:01 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • danslo
  • Registratie: Januari 2003
  • Laatst online: 10-04 19:55
En opgelost idd door een soort buffer te maken.. (hoefde in dit geval niet in een array omdat de server toch maar op 1 packet wachtte voordat ie verder ging :)) :

code:
1
2
3
4
5
    If wSServer.State = 6 Then '... "Still connecting"
        pBuffer = cv_StringFromHex(data)
        tmrBuffer.Enabled = True 'Start buffer timer
    Else
        'Bla bla send stuff normaal hier


code:
1
2
3
4
5
6
7
8
Private Sub tmrBuffer_Timer()
    
    If wSServer.State = 7 Then 'Eindelijk geconnect!
        wSServer.SendData pBuffer 'Stuur data
        tmrBuffer.Enabled = False 'Disable timer zodat data niet nog een keer verzonden wordt.
    End If
    
End Sub


Bedankt
Pagina: 1