VB.NET bir kaynak oyun sunucusuna bağlanıyor

3 Cevap php

Ben LAN üzerinde çalışan Kaynak-tabanlı oyunları algılayan bir uygulama geliştiriyorum. "TSource Engine Query" tarafından izlenen bir A2S_INFO sorgu (0xFFFFFFFF göndererek, port 27015 üzerinde bir UDP bağlantı yapma: specifications provided by Valve, bunu ben istiyorum tam olarak ne kadar daralmış zorunda takip etmek ) ve ikili cevap ayrıştırma.

Bu benim ile çalışıyorum kodu:

Dim sIP As String = "192.168.0.154"
Dim nPort As Integer = 27015

Dim connectionMessage As String = "ÿÿÿÿTSource Engine Query" & Chr(0)

Dim endPoint As New IPEndPoint(IPAddress.Parse(sIP), nPort)

Dim client As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 6000)
client.SendTo(Encoding.ASCII.GetBytes(connectionMessage), endPoint)
Console.WriteLine("Message sent to " & sIP & ":" & nPort & vbCrLf & connectionMessage)
Dim sBuffer(1400) As Byte
Try
    client.ReceiveFrom(sBuffer, endPoint)
    MsgBox(System.Text.Encoding.Unicode.GetString(sBuffer))
Catch ex As SocketException
    MsgBox("Failed to receive response on " & sIP & ":" & nPort & ":" & vbCrLf & ex.Message)
End Try

Ben bana bildiren, SocketError.TimedOut istisnalar almaya devam:

Failed to receive response on 192.168.0.154:27015: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

Aşağıdaki çok basit bir PHP sürümü bir cazibe gibi çalışır, çünkü ben, bu cevaba çok yakın eminim:

$ip = "192.168.0.154";
$port = 27015;

$fp = fsockopen("udp://".$ip,$port, $errno, $errstr);
socket_set_timeout($fp, 6);

$prefix = "\xff\xff\xff\xff";
$command = "TSource Engine Query";
$msg = "$prefix$command";
fputs($fp, $msg, strlen($msg));

$response = "";
do {
    $response .= fgets($fp, 16);
    $status = socket_get_status($fp);
} while ($status['unread_bytes']);
fclose ($fp);

echo $response;

Bu özelliklerine uygun bir cevap ile bana sağlar.

Ben yakın değilim, ama bir şey benim VB.NET kodu ile yanlış bulunuyor. Ben yanlış ne yapıyorum?

The solution

Kodlama türü ikili veri aktarımı için geçerli değildir. Ben şu değiştirilmiştir:

Encoding.ASCII.GetBytes(connectionMessage)

ile:

System.Text.Encoding.[Default].GetBytes(connectionMessage)

Ve anında çözüldü.

Bir daha sağlam bir çözüm, "pub" tarafından önerilen, (ben bu test edilmemiş olmasına rağmen) kod sayfasını belirtmek için olabilir:

Encoding.GetEncoding("iso-8859-1").GetBytes(connectionMessage)

3 Cevap

Eğer CodeProject bu Multi-Threaded Game Server Browser in VB.Net makale bakmak mı? Eğer zaten yazılmıştı kodu tekrar kullanmak istemiyorsanız, ben size onlar sizin sorununuzu bulup bulamayacağını görmek için nasıl yaptığını kontrol edebilirsiniz eminim.

O, barışı Umut olur.

Iso-8859-1 kod sayfası bilgisayar kullanımı varsayılan olarak ayarlamak yok dünyada bu çift çocuklar için:

("Iso-8859-1"). GetBytes (connectionMessage) Encoding.GetEncoding