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)