Advertisement

RakNet making call to php page

Started by July 20, 2014 03:33 PM
10 comments, last by BeerNutts 10 years, 4 months ago

RakNet has TCPInterface and HTTPConnection classes. I'm trying to make a call to a php page passing in a query string but it's not working. The final result should be data in a database but after I run it from C++ using RakNet there is no db entry. If I just use the url in a browser then there is an entry. So it's something to do with how I'm calling this from RakNet.

This works in a browser

http://localhost/MyWebApp/gnet.php?opt=add&game=MyGame&server=mygame.net

This doesn't work (no error just no db entry) in C++ using RakNet


TCPInterface *tcp = RakNet::OP_NEW<TCPInterface>(__FILE__, __LINE__);


tcp->Start(0, 64);


HTTPConnection* http = RakNet::OP_NEW<HTTPConnection>(__FILE__, __LINE__);


http->Init(tcp, "localhost");


http->Update();


http->Post("/MyWebApp/gnet.php", "?opt=add&game=MyGame&server=mygame.net");


RakString data;
data = http->Read();
http->HasBadResponse(NULL, &data);

When you browse to http://localhost/MyWebApp/gnet.php?opt=add&game=MyGame&server=mygame.net it works, right? Then it's GET not POST.


http->Get("/MyWebApp/gnet.php?opt=add&game=MyGame&server=mygame.net");

POST is when you submit form data through button click (more or less), not to mention you used POST incorrectly.

Advertisement

That didn't work either.

1. Look at the PHP error log and access log. Did the request make it to your server?

2. Use Wireshark on the client machine -- does the request make it out onto the network to the right destination port?

3. Check all error return values -- are you getting an error somewhere that you're not aware of?

4. Finally, it is very bad form to modify a database in response to a GET request. Browser and network proxies will often treat GET as "safe," and may re-issue a second GET request if the first one somehow fails. Browsers and proxies may also pre-fetch "predicted" GET requests even if you haven't yet actually issued them, to "speed up your web experience."

Note that you don't have control over all network proxies -- there are often ISP-installed or government-intalled proxies between your client and your sever in real life.

POST and PUT are there for modifying data. POST and PUT data live in the request body, not the URL. The URL just identifies "which resource," not "what data" or "what operation." The typical encoding of a POST body is largely the same as a URL query string, but put in the body of the request.
enum Bool { True, False, FileNotFound };

1. No error or access log errors for php.

2. Wireshark shows nothing when filtering TCP/UDP on port 80. When I have no filters I don't seem to see anything either but the traffic lines move pretty fast since way more stuff is happening.

3. The only function that has a return value is tcp->Start() and that returns true.

4. That's a good point and I'll change it as soon as I can get RakNet to show any sort of activity using the easier Get.

I've used RakNet before with it's normal UDP method of doing things, but I've never used this HTTPConnection object and I can't seem to find much information about it at all. I know there are other libraries I could use but would prefer to not introduce another dependency to the project to do this when RakNet looks like it can handle it, but I just don't know who to work with it. Anyone have any experience with the HTTPConnection class?

2. Wireshark shows nothing when filtering TCP/UDP on port 80. When I have no filters I don't seem to see anything either but the traffic lines move pretty fast since way more stuff is happening.


Chances are, then, that you're not getting RakNet to actually send the message. Thus, you're not using the library correctly somehow.
I suggest getting the open source version and stepping through it in the debugger.

Separately, when "data scrolls by quickly," the right thing to do is to start recording, provoke whatever it is you want to look for, and then stop recording, and then look at the capture after-the-fact for traces of clues. For example, maybe there is a DNS look-up (typically on port 53) for the address you're trying to connect to?
enum Bool { True, False, FileNotFound };
Advertisement

Separately, when "data scrolls by quickly," the right thing to do is to start recording, provoke whatever it is you want to look for, and then stop recording, and then look at the capture after-the-fact for traces of clues.

Yep, that's what I do.


Thus, you're not using the library correctly somehow.

Yep, that's what I figured. This doesn't seem to be a popular process for RakNet since there is very little information online about it. I do have the open source version. I'll try stepping through but RakNet is rather complicated so I doubt I'll be able to see why it's not working, but will give it a try.


4. Finally, it is very bad form to modify a database in response to a GET request. Browser and network proxies will often treat GET as "safe," and may re-issue a second GET request if the first one somehow fails. Browsers and proxies may also pre-fetch "predicted" GET requests even if you haven't yet actually issued them, to "speed up your web experience."

<SemiOffTopic>

In my day job I primarily develop web applications. No one seems to understand that GETs should not update the database. No one. I helped another developer one time discover the source of a bug in his application. Essentially something was being written to the database at unexpected times. I took one look and knew immediately what was happening: A user's browser had decided that the URL was visited often enough that it decided it was important enough to thumbnail. Whenever that user opened Safari or a new tab, there was a chance the browser would fetch the page to refresh the thumbnail. If the web app had POSTed instead of issuing a GET to create that record, there would have been no problem.

</SemiOffTopic>

When I create ASP.NET MVC web apps I only use POST for this stuff (almost everything I do is ajax calls updating a database at some point). I've inherited this php script and don't really work with php all that much. This is a very simple app and multiple get calls won't cause issues with the db based on how this specific app works and does checks before doing anything with the db, but yes I agree POST is the way to go, but just want to simplify the RakNet side by getting a simple GET to work. I'm not in refactoring mode or caring about this php script at this moment (as again it works and I inherited it with it using GET and I haven't looked into how to work with POST in a php script, which I will do at a later time) I simply need to get RakNet making valid HTTP calls.


No one seems to understand that GETs should not update the database. No one.

There are a lot of rules to remember/experience and a lot of frameworks/languages that people work in. It stands to reason some will be missed by some people. I've written console/desktop apps for most of my life and now switching to web apps within the last year (although this issue isn't for work but play). People all have different situations going on.

Found this on the web, maybe you have to use the RakNet::TCPInterface::Receive() function after you call Get():


   RakNet::TCPInterface tcp;
   RakNet::HTTPConnection httpConnection;

   httpConnection.Init(&tcp, "www.google.com");
   httpConnection.Get("index.html");
   
   tcp.Start(0, 64);
   
   while (1)
   {
      RakNet::Packet *packet = tcp.Receive();
      if(packet)
      {
         httpConnection.ProcessTCPPacket(packet);
         tcp.DeallocatePacket(packet);
      }
      httpConnection.Update();

      if (httpConnection.IsBusy()==false)
      {
         RakNet::RakString fileContents = httpConnection.Read();
         printf(fileContents.C_String());
         return;
      }
      // Prevent 100% cpu usage
      RakSleep(30);
   }

My Gamedev Journal: 2D Game Making, the Easy Way

---(Old Blog, still has good info): 2dGameMaking
-----
"No one ever posts on that message board; it's too crowded." - Yoga Berra (sorta)

This topic is closed to new replies.

Advertisement