• Create Account

## RakNet making call to php page

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

11 replies to this topic

### #1rpiller  Members

838
Like
0Likes
Like

Posted 20 July 2014 - 09:33 AM

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

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();

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

### #2Zaoshi Kaba  Members

7781
Like
0Likes
Like

Posted 20 July 2014 - 10:56 AM

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.

Edited by Zaoshi Kaba, 20 July 2014 - 10:59 AM.

### #3rpiller  Members

838
Like
0Likes
Like

Posted 20 July 2014 - 11:17 AM

That didn't work either.

### #4hplus0603  Moderators

10568
Like
3Likes
Like

Posted 20 July 2014 - 02:43 PM

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 };

### #5rpiller  Members

838
Like
0Likes
Like

Posted 21 July 2014 - 06:25 AM

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?

Edited by rpiller, 21 July 2014 - 06:28 AM.

### #6hplus0603  Moderators

10568
Like
0Likes
Like

Posted 21 July 2014 - 08:56 AM

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 };

### #7rpiller  Members

838
Like
0Likes
Like

Posted 21 July 2014 - 09:14 AM

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.

Edited by rpiller, 21 July 2014 - 09:15 AM.

### #8smr  Members

2388
Like
0Likes
Like

Posted 21 July 2014 - 10:39 AM

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>

### #9rpiller  Members

838
Like
0Likes
Like

Posted 21 July 2014 - 11:26 AM

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.

Edited by rpiller, 21 July 2014 - 11:32 AM.

### #10BeerNutts  Members

4287
Like
1Likes
Like

Posted 21 July 2014 - 11:30 AM

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.Get("index.html");

tcp.Start(0, 64);

while (1)
{
if(packet)
{
httpConnection.ProcessTCPPacket(packet);
tcp.DeallocatePacket(packet);
}
httpConnection.Update();

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


Edited by BeerNutts, 21 July 2014 - 11:34 AM.

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)

### #11rpiller  Members

838
Like
0Likes
Like

Posted 21 July 2014 - 11:44 AM

That worked! Thank you so much for the proper usage. Where did you find that if I may ask?

### #12BeerNutts  Members

4287
Like
1Likes
Like

Posted 21 July 2014 - 12:22 PM

That worked! Thank you so much for the proper usage. Where did you find that if I may ask?

googled "raknet http connection" and it turned this up:

http://www.jenkinssoftware.com/forum/index.php?topic=4298.0

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)

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.