Hi,
 
I'm writing a set of class libs for .NET/Mono,
except for the UTF7 Encoding in my other post, it should work fine.
And it does on .NET, but not on Mono.
 
I don't know where to start, but I'll try to explain.
 
First of all I have a Base Class which amongst other members has the following function
 
 private void ExecuteQuery()
  {
   UdpClient client = new UdpClient();
   //Connect to the server and send the query data
   try
   {
    client.Connect(ip,port);
    client.Send(data,data.Length);
   }
   catch
   {
    client.Close();
    throw new Exceptions.InvalidHostException("Unknown host: " + ip);
   }
 
   //Listen for a response - This is the client side
   IPEndPoint serverIPEndPoint = new IPEndPoint(IPAddress.Any,0);
   
   //Receive the response
   try
   {
    queryResponse = client.Receive(ref serverIPEndPoint);
   }
   catch (Exception e)
   {
    throw new Exceptions.ConnectionRefusedException("The connection was refused by the remote host: " + ip + ":" + port.ToString() + "\n" + e.Message,e);
   }
   finally
   {
    client.Close();
   }
  }
 
As you can see it sends a n array of bytes to the server and receives some in return.
 
Then I have a derived class which has 2 important functions:
 
  public string RequestStatus()
  {
   //Create the byte[] array to send
   byte[] query = {0xFF,0xFF,0xFF,0xFF,0x67,0x65,0x74,0x73,0x74,0x61,0x74,0x75,0x73,0xA};
   
   //Create a new separator
   char separator = Convert.ToChar(10);
 
   //A statusRequest consists of both rules and players separated by char(10)
   string[] response = this.QueryToString(query).Split(separator);
   
   //Get the rules and players
   string rules = this.RulesToXml(response[0]);
   string players = this.PlayersToXml(response);
  
   return this.CreateXmlBody("Quake3","statusRequest",string.Concat(rules,players));
  }
 
And
 
  public string RequestInfo()
  {
   //Create the byte[] array to send
   byte[] query = {0xFF,0xFF,0xFF,0xFF,0x67,0x65,0x74,0x69,0x6E,0x66,0x6F,0xA};
   
   //Query the server and get the response in a string
   string response = this.QueryToString(query);
   
   //Create the default xml body and put the rules in it
   string returnValue = this.CreateXmlBody("Quake3","infoRequest",this.RulesToXml(response));
 
   //return the XML
   return returnValue;
  }
 
As you can see there is almost no difference between them.
Now they both run fine with the .NET runtime, but with the mono runtime the .RequestStatus() fails.
 
When does it fail well when the QueryToString function is called,
so if I run RequestInfo() the QueryToString function is called and it all works fine,
if I run RequestStatus() the QueryToString function is called and it goes wrong.
In my opinion the only difference so far is the array of bytes to be sent.
 
Example:
 
Let's say I use the following code for an application
 
using System;
using TPSoftware.Q3PlugsNet;
using TPSoftware.Q3PlugsNet.Exceptions;
 
class MainClass
{
 public static void Main(string[] args)
 {
      
  //Create a new Q3Query
 
 // Q3Query quakeClient = new Q3Query("195.130.132.153",27961);
  Q3Query quakeClient = new Q3Query("195.130.132.155",27961);
  
  try
  {
   string info = quakeClient.RequestStatus();
   Console.WriteLine(info);
  }
  catch (Exception e)
  {
   Console.WriteLine("ERROR:");
   Console.WriteLine("\n" + e.ToString());         
            
  }
  finally
  {
  Console.ReadLine();
  }
 }
}
Well then I get the following result with .NET runtime
 
<?xml version="1.0" encoding="utf-7" standalone="yes"?><Q3Plugs.NET><Query type=
"statusRequest" protocol="Quake3"><Server ipadress="195.130.132.155" port="27961
" /><Rules count="28"><rule name="capturelimit"><![CDATA[8]]></rule><rule name="
sv_floodProtect"><![CDATA[0]]></rule><rule name="sv_maxPing"><![CDATA[0]]></rule
><rule name="sv_minPing"><![CDATA[0]]></rule><rule name="sv_maxRate"><![CDATA[15
000]]></rule><rule name="sv_punkbuster"><![CDATA[0]]></rule><rule name="sv_maxcl
ients"><![CDATA[14]]></rule><rule name="sv_hostname"><![CDATA[Telenet Q3A OSP CA
 Server]]></rule><rule name="timelimit"><![CDATA[0]]></rule><rule name="fraglimi
t"><![CDATA[25]]></rule><rule name="dmflags"><![CDATA[8]]></rule><rule name="ver
sion"><![CDATA[Q3 1.32 linux-i386 Oct  7 2002]]></rule><rule name="g_gametype"><
![CDATA[5]]></rule><rule name="protocol"><![CDATA[68]]></rule><rule name="mapnam
e"><![CDATA[q3dm6]]></rule><rule name="sv_privateClients"><![CDATA[2]]></rule><r
ule name="sv_allowDownload"><![CDATA[1]]></rule><rule name="server_promode"><![C
DATA[0]]></rule><rule name="server_cq3"><![CDATA[0]]></rule><rule name="g_needpa
ss"><![CDATA[0]]></rule><rule name="server_ospauth"><![CDATA[2]]></rule><rule na
me="gamename"><![CDATA[osp]]></rule><rule name="gameversion"><![CDATA[OSP v1.03]
]></rule><rule name="Players_Red"><![CDATA[2 4 6 8 10 ]]></rule><rule name="Play
ers_Blue"><![CDATA[1 3 5 7 9 ]]></rule><rule name="Score_Red"><![CDATA[15]]></ru
le><rule name="Score_Blue"><![CDATA[17]]></rule><rule name="Score_Time"><![CDATA
[Round 33/49]]></rule></Rules><Players count="10"><Player score="20" ping="15"><
![CDATA["^5DA^4.^5Ch^7a^5o^7s"]]></Player><Player score="12" ping="24"><![CDATA[
"UnnamedPlaye^1r"]]></Player><Player score="48" ping="38"><![CDATA["^b^0*^n^7mnl
^b^0*"]]></Player><Player score="38" ping="38"><![CDATA["^xffffff^9eHk^b^4*^n^0T
^9N^0T"]]></Player><Player score="80" ping="25"><![CDATA["^5B^7osje^5R"]]></Play
er><Player score="85" ping="24"><![CDATA["^x00FF00^2911^xFFFFFF^0>>^7SaTo"]]></P
layer><Player score="18" ping="52"><![CDATA["^4jerome"]]></Player><Player score=
"96" ping="41"><![CDATA["^x3366FF^7e^0C^7'.E^0mo^7Z"]]></Player><Player score="1
1" ping="16"><![CDATA["crypto"]]></Player><Player score="73" ping="40"><![CDATA[
"^0fearl^33^0ss"]]></Player></Players></Query></Q3Plugs.NET>
But I get the following with the mono runtime:
 
Unhandled Exception: TPSoftware.Q3PlugsNet.Exceptions.ConnectionRefusedException
: The connection was refused by the remote host: 195.130.132.155:27961
Some sort of w32 error occurred ---> System.Net.Sockets.SocketException: Some so
rt of w32 error occurred
in (unmanaged) 06 System.Net.Sockets.Socket:RecvFrom_internal (intptr,byte[],int
,int,System.Net.Sockets.SocketFlags,System.Net.SocketAddress&)
in <0x00004> 06 System.Net.Sockets.Socket:RecvFrom_internal (intptr,byte[],int,i
nt,System.Net.Sockets.SocketFlags,System.Net.SocketAddress&)
in <0x00155> 00 System.Net.Sockets.Socket:ReceiveFrom (byte[],int,int,System.Net
.Sockets.SocketFlags,System.Net.EndPoint&)
in <0x00180> 00 System.Net.Sockets.Socket:ReceiveFrom (byte[],int,int,System.Net
.Sockets.SocketFlags,System.Net.EndPoint&)
in <0x0002a> 00 System.Net.Sockets.Socket:ReceiveFrom (byte[],System.Net.EndPoin
t&)
in <0x000af> 00 System.Net.Sockets.UdpClient:Receive (System.Net.IPEndPoint&)
in <0x0016b> 00 TPSoftware.Q3PlugsNet.QueryBase:ExecuteQuery ()
--- End of inner exception stack trace ---
 
in <0x002b4> 00 TPSoftware.Q3PlugsNet.QueryBase:ExecuteQuery ()
in <0x0005b> 01 System.MulticastDelegate:invoke_void ()
 
However if I change the above code to:
 
using System;
using TPSoftware.Q3PlugsNet;
using TPSoftware.Q3PlugsNet.Exceptions;
 
class MainClass
{
 public static void Main(string[] args)
 {
      
  //Create a new Q3Query
 
 // Q3Query quakeClient = new Q3Query("195.130.132.153",27961);
  Q3Query quakeClient = new Q3Query("195.130.132.155",27961);
  
  try
  {
   string info = quakeClient.RequestInfo(); // RequestInfo instead of RequestStatus !!!!!!!!
   Console.WriteLine(info);
  }
  catch (Exception e)
  {
   Console.WriteLine("ERROR:");
   Console.WriteLine("\n" + e.ToString());         
 
           
  }
  finally
  {
  Console.ReadLine();
  }
 }
}
 
I get the following output with .NET
 
<?xml version="1.0" encoding="utf-7" standalone="yes"?><Q3Plugs.NET><Query type=
"infoRequest" protocol="Quake3"><Server ipadress="195.130.132.155" port="27961"
/><Rules count="9"><rule name="game"><![CDATA[osp]]></rule><rule name="punkbuste
r"><![CDATA[0]]></rule><rule name="pure"><![CDATA[1]]></rule><rule name="gametyp
e"><![CDATA[5]]></rule><rule name="sv_maxclients"><![CDATA[12]]></rule><rule nam
e="clients"><![CDATA[2]]></rule><rule name="mapname"><![CDATA[q3dm6]]></rule><ru
le name="hostname"><![CDATA[Telenet Q3A OSP CA Server]]></rule><rule name="proto
col"><![CDATA[68]]></rule></Rules></Query></Q3Plugs.NET>
And the following output with mono (don't mind the encoding, that's another bug)

???xml version???1.0?? encoding???utf-7?? standalone???yes???? ??Q3Plugs.NET? ??
Query type???infoRequest?? protocol???Quake3??? ??Server ipadress???195.130.132.
155?? port???27961?? /? ???Rules count????+BDJAAARO????? name?????+BDJAAARO???+E
JwMQFQE+AFs-osp???+-???/rule???+QAA-rule name???????+BDJAAARO???+EJwMQFQE+AFs-0?
??+-???/rule???+QAA-rule name?????+BDJAAARO???+EJwMQFQE+AFs-1???+-???/rule???+QA
A-rule name??????+BDJAAARO???+EJwMQFQE+AFs-5???+-???/rule???+QAA-rule name????+B
G8AAA-maxclients???+AAAETEEl???+-AFs-12???+-???/rule???+QAA-rule name??????+BDJA
AARO???+EJwMQFQE+AFs-2???+-???/rule???+QAA-rule name??????+BDJAAARO???+EJwMQFQE+
AFs-q3dm6???+-???/rule???+QAA-rule name??????+BDJAAARO???+EJwMQFQE+AFs-Telenet Q
3A OSP CA Server???+-???/rule???+QAA-rule name??????+BDJAAARO???+EJwMQFQE+AFs-68
???+-???/rule???+QAA-/Rules?????/Query? ??/Q3Plugs.NET?
 
So this works fine (more or less) and doesn't throw any errors.
 
So my question: Why does RequestStatus cause an error while RequestInfo does not.
 
If you want to view the full sources of the library please visit:
 
Thnx,
Timothy P.
 
 

---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.463 / Virus Database: 262 - Release Date: 17/03/2003

Reply via email to