visual basic socket svar

Tags:    visual-basic

Hej Alle,

Jeg er ved at lave en socket til VB og PHP,
PHP opretter en socket til en VB server med en streng i, VB tjekker op om det er den rigtige streng.... men så laver php og VB fejl, PHP fejler fordi den ikke får noget retur, og VB fordi Socket'en bliver lukket af PHP...

Sourcen ser således ud:

------------------PHP---------------------
$fp = fsockopen ("udp://10.0.0.2", 2770, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br>\\n";
} else {
fputs ($fp, "phptosupporter");
while (!feof($fp)) {
echo fgets ($fp,128);
}
fclose ($fp);
}
-------------------------------------------

------------------VB-----------------------
Dim X As New Collection
'Opret collection til at gemme passwords i.

Private Sub Form_Load()
Form1.Visible = False
X.Add "phptosupporter"
'Gem de to gyldige passwords

Wsck.Protocol = sckUDPProtocol
'Sæt protokolen til UDP

Wsck.LocalPort = "2770"
'Sæt serverens lokale port til 2770

Wsck.Bind
'Lad serveren begynde at lytte på porten

End Sub

Private Sub Wsck_DataArrival(ByVal bytesTotal As Long)
Dim TestData, Status As String
Wsck.GetData TestData, vbString
'Modtag data og læg dem i TestData
For N = 1 To X.Count
If X.Item(N) = TestData Then Status = "OK"
Next N
Wsck.RemotePort = "2770"
'Sæt client port til 2770. Er hardcodet ind i clienten
If TestData = "" Then Status = "0"
'Test om password er OK
If Status = "OK" Then
Wsck.SendData "hestesko"
MsgBox "Nogen har brug for hjælp"
Else
Wsck.SendData "0"
End If
'Send svar til client
End Sub
--------------------------------------------

Jeg skal altså have VB til at at komme frem med en advarsel når den modtager en socket, og derefter sende tilbage til PHP med at den er modtaget.....

Jeg ved godt at den er svær, men den der kan komme med en source der virker med det får alle mine 500 UP.

TAK


####################
#MVH Martin | PHPCODER.DK#
####################



5 svar postet i denne tråd vises herunder
4 indlæg har modtaget i alt 16 karma
Sorter efter stemmer Sorter efter dato
Der sker et eller andet et sted mellem PHP og VB.
Hvad det er ved jeg ikke, gidder ikke begynde at sniffe på netværket lige nu, er på arbejde.
Mine gæt er at dels er problemet for PHP at du bruger udp, for så er det connections less, dvs PHP regner med at der bliver åbnet og lukket ind imellem, uden af PHP af den grund ændrer status på dit Socket handle i PHP.
Desuden læser fgets indtil den har læst din störrelse, eller den möder newLine eller EOF.
Jeg tror aldrig den möder EOF fordi du bruger udp, og jeg prövede at smide vbNewline med men til ingen nytte .. måske er den bare \\r istedet for \\r\\n eller noget andet.

Det jeg så foreslår er at du laver en lille sub i din VB del der modtager en tekst og regner længden af den og laver en anden streng på 3 tegn med længden i og 0 til at fylde foran hvis der skal fyles op (er længden 8 så laver du '008', er den 45 så '045', er den 999 så '999'), sender så först denne længde streng afsted igennem socket og bagefter selve strengen afsted.

Til test kan du indsætte
Wsck.SendData "008"
inden linien
Wsck.SendData "hestesko"
inden du begynder på den function jeg beskrev.

På PHP siden skal du sæ ændre koden så den læser længden af beskeden först og bagefter læser selve beskeden.

Efter linien:

fputs ($fp, "phptosupporter");

er koden sådan her i min test:

$indata = "";
$done = false;
$len = fgets ($fp,3);
echo "Længde: " . $len . "\\r\\n";
while (!feof($fp) && !$done) {
$indata = fgets ($fp,$len);
if (strlen($indata) == $len)
$done = true;
else
echo "Læste for lidt.\\r\\n";
}
echo "Læste: " . $indata . "\\r\\n";
fclose ($fp);
}

Nu læses længden ind og bruges til at læse beskeden.



Hej Martin PHP koder.

Jeg kender desværre ikke så meget til PHP. Men så vidt jeg kan se så skal Visual Basic programmet agere som server. Så PHP sender en forespørgsel og venter på svar fra VB Serveren.

Hvis jeg var dig ville jeg bruge ServerControl i stedet for winsock på serversiden. Det kan godt være at winsock kan bruges til at agere som Server, men jeg har aldrig haft held med det. Du henter den ind som en almindelig komponent. Den hedder ServerControl.ocx. Jeg kan desværre ikke vedhæfte filen her, men jeg ligger den op på ftp server 62.79.78.29. public//public.

For at starte serveren bruger man .StartServer <portnr>, <IP>

Private Sub Form_Load()
Server1.StartServer <portnr>, <IP>

Der er en DataArrival eventhandler som i winsock.

Private Sub Server1_DataArrival(ByVal SckIndex As Integer, ByVal data As String, ByVal bytesTotal As Long, ByVal RemoteIP As String, ByVal RemoteHost As String)

Det eneste du behøver at bruge for at sende data tilbage til klienten er SckIndex.

Server1.SendData <SendString>, SckIndex

Den vil bruge TCP som protokol stak pr. default. Man kan sikkert sætte den op til at køre UDP. Men jeg vil foreslå at du bruger TCP.


Rigtige programmører programmerer binært. 0/1





Selvom jeg ikke tror det er hele problemet, så kan en del af problemet være at TestData i din Wsck_DataArrival rutine er en Variant i stedet for en String. Der sker ihvertfald ikke noget frygteligt ved at rette dette til følgende:
<pre>Dim TestData As String, Status As String</pre>
Bare en ide.



Hej Alle,

Sourcen ser således ud:


Nu jeg ikke nogle winsock hej. Men er det ikke noget med at du skal acceptere connections før du kan arbejde med dem ?
Noget alla:

Fold kodeboks ind/udKode 






Er der en særlig grund til at du til bruge udp ?!?



t