Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Nettipeli C++:lla

Sivun loppuun

Atte [01.10.2006 09:53:07]

#

Piitkästä aikaa kirjoittelen Ohjelmointiputkaan :)

Eli, olen alkanut lähiaikoina alkanut opetella C++:n ja SDL:n käyttöä ja sisäistänyt niiden peruspiirteet aika hyvin. Tavoitteena olisi siis saada tehtyä yksinkertainen, reaaliaikainen nettipeli. Eli kysymykset ovat:

1) Mikä olisi hyvä (ja mielellään yksinkertainen) kirjasto nettipelien tekemiseen?

2) Löytyykö kyseiseen kirjastoon hyviä (mieluiten suomenkielisiä) oppaita/tutoja netistä?

3) Tarkoitus on, että serveri ottaa aina käynnistyessään yhteyden sivuni.osoite.fi/addserver.php:n, joka lisää sen serverlist.dat -tiedostoon, jonka sisällön taas clienttiohjelma hakee ja listaa käyttäjälle. Millä kirjastolla nämä saisi toteutettua ja mikä olisi hyvä tekniikka 'haamuserverien' estoon?

Heikki [01.10.2006 10:01:30]

#

Käyttäisin SDL_Nettiä, koska muutenkin on SDL käytössä. Suomenkielistä tutoriaalia en ole nähnyt, mutta dokumentaatiota lukemalla pääsee pitkälle.

SDL_Netillä voit hakea myös PHP-skriptin tulostuksen, lähetät HTTP-protokollan mukaisesti palvelimelle pyynnön saada sivu (php-skripti) jonka jälkeen serveri lähettää sen skriptin tuotoksen.

Metabolix [01.10.2006 10:49:44]

#

Itse varmaankin toteuttaisin tuon haamuneston jotenkin niin, että ensimmäisellä yhdistyksellä pelille annetaan oma tunniste, jolla se sitten vaikkapa viiden minuutin välein ilmoittaa olevansa yhä toiminnassa, ja PHP-skripti taas antaa vain ne palvelimet, joilta on viimeisen kuuden minuutin aikana tullut varmistus. Jälkimmäisessä siis on hieman pidempi aikaraja, jotta pieni viive ei pääse rikkomaan kaikkea. Sitten tietenkin voi palvelimelta avata vaikkapa yhden UDP-portin, jonka kautta kuljettaa tarkkailuliikennettä eli vastaa pystyssäolokyselyyn yms.

Meitsi [01.10.2006 10:51:20]

#

Ei nyt tullut ihan selväksi mitä tarkoitit haamuservereillä, mutta jos tarkoitit että suljetut serverit poistetaan listalta, niin silloin melkein järkevin vaihtoehto olisi että aina kun php-sivulta pyydetään serverilistausta, php katsoo onko servereitä pingattu vähään aikaan (tämä tarkistus siksi, ettei niitä pingattaisi joka kerralla kun lista haetaan, vaan vain silloin kun edellisestä pingistä on aikaa) ja pingaa tarvittaessa kaikki serverilistan serverit läpi ja poistaa ne jotka eivät vastaa. Tämä kyllä kannattaa tehdä jollakin muulla tapaa kuin php:llä, mutta pointti tuli varmaan selväksi :)

EDIT: Hidas minä

A-P [01.10.2006 18:41:17]

#

Atte kirjoitti:

1) Mikä olisi hyvä (ja mielellään yksinkertainen) kirjasto nettipelien tekemiseen?

Mikä tahansa kuorrutus Socketeille.

Atte kirjoitti:

3) Tarkoitus on, että serveri ottaa aina käynnistyessään yhteyden sivuni.osoite.fi/addserver.php:n, joka lisää sen serverlist.dat -tiedostoon, jonka sisällön taas clienttiohjelma hakee ja listaa käyttäjälle. Millä kirjastolla nämä saisi toteutettua ja mikä olisi hyvä tekniikka 'haamuserverien' estoon?

Kuten Metabolix:kin sanoi, jonkinlainen aikaraja listalla oleville palvelimille. Esim. palvelimen on ilmoitettava olemassa olostaan säännöllisin väliaijoin.

Atte [07.10.2006 19:03:03]

#

Kiitos vinkeistä, sain jo aikaan SDL_netin ja UDP:n avulla simppelin, toimivan keskusteluohjelman.

Minulle jäi epäselväksi vain tuo Heikin selitys SDL_netin käytöstä PHP -skriptin kanssa. Saisiko jonkinlaista demonstraatiokoodia, miten se toteutettaisiin?

Metabolix [07.10.2006 19:08:31]

#

Sillä tavalla, että otat yhteyden palvelimen porttiin 80 ja lähetät sinne sopivaa tekstiä, jolloin palvelin lähettää sen sivun sisällön eli PHP-skriptin tulostuksen. Haku auttaa, ainakin VB-puolella on malleja HTTP-pyynnöistä, ja helpostikos noita Googlellakin löytyy.

Heikki [07.10.2006 20:09:43]

#

HTTP-protokollan perustiedot löydät esimerkiksi Wikipedian artikkelista. Esimerkiksi putkan palvelimelta voisit pyytää index.php-sivua (eli etusivua) seuraavalla tavalla:
1. Käynnistä komentorivi (Windowsissa käynnistä - suorita - cmd) ja aja komento telnet ohjelmointiputka.net 80 (en ole kokeillut muuta kuin Linuxissa, mutta uskoisin että Windowsista löytyy sama telnet-ohjelma ja sitä käytetään samalla tavalla).
2. Kirjoita sivupyyntö:

GET https://www.ohjelmointiputka.net/index.php

Ja katso minkälaisen vastauksen serveri antaa (jos ei anna mitään vastausta, paina entteriä vielä toistamiseen).

Atte [08.10.2006 10:19:46]

#

Kiitos, nyt ymmärrän paremmin. Osaatteko sanoa, miksi tällainen räpellys ei toimi?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>

using namespace std;

#include "SDL/SDL_net.h"

int main(int argc, char **argv)
{
	IPaddress ip;
	TCPsocket sd;

	char buffer[512] = "GET https://www.ohjelmointiputka.net/index.php"

	SDLNet_Init();

	SDLNet_ResolveHost(&ip,"https://www.ohjelmointiputka.net",80);

	sd = SDLNet_TCP_Open(&ip);

	SDLNet_TCP_Send(sd,(void *)buffer,strlen(buffer) + 1);

    SDLNet_TCP_Recv(sd,buffer,512);

	printf("%s",buffer);

	SDLNet_TCP_Close(sd);
	SDLNet_Quit();

	return EXIT_SUCCESS;
}

Metabolix [08.10.2006 10:50:53]

#

Ota SDLNet_ResolveHost-funktion parametrista http:// pois. Se ei kuulu palvelimen nimeen. Lisäksi ota pyynnoöstä alkuosa pois, haluat sivun /index.php. Host-määre on myös paikallaan, ja rivit päättyvät rivinvaihtoihin \n.

Jatkossa voisit yrittää myös kirjoittaa koodiisi virheenkäsittelyä eli jokaisen funktion kohdalla tarkistaa palautusarvon ja tarvittaessa tulostaa virheilmoituksen. Tällöin voisit aina kysellessäsi helposti kertoa, mikä kohta koodista ei toimi, jolloin virhettäkin olisi mukavampi etsiä.

/* Kirjaston dokumentaatio kertoo lähes aina, mitä palautusarvot takoittavat. Yleensä 0 on onnistunimen ja -1 virhe. */
if (SDLNet_ResolveHost(&ip, "www.ohjelmointiputka.net",80) != 0) {
    /* Tulostetaan virhevirtaan. Yleensä sekin menee konsoliin, Windowsissa SDL usein ohjaa sen tiedostoon stderr.txt. */
    fprintf(stderr, "Virhe: SDLNet_ResolveHost: %s\n", SDLNet_GetError());
}

Ja näyttäisi tuolta yksi puolipistekin puuttuvan buffer-muuttujan määrittelyn perästä.

Muutamalla aputulostuksella sain tuolta ohjelmalta ulos tällaista:

Lähetetään 48 tavua, seuraava teksti:
GET / HTTP/1.1
Host: www.ohjelmointiputka.net

Saatiin palvelimelta 456 tavua, seuraava teksti:
HTTP/1.1 400 Bad Request
Date: Sun, 08 Oct 2006 08:26:32 GMT
Server: Apache
Content-Length: 290
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr>
<address>Apache Server at srv4.louhi.net Port 80</address>
</body></html>

Aika tyly vastaus. :) Eli pitää varmaan vähän lisää ihmetellä vielä tuota formaattia. Jospa tekisit minimaalisen palvelinohjelman, joka tulostaa saamansa pyynnön (tai vaikka lähettää sen takaisin), niin voisit sitten itse tutkia, millainen pyyntö selaimeltasi tarkalleen lähtee. http://localhost:9999/index.php.

Atte [08.10.2006 12:53:32]

#

Juu, puolipiste oli jäänyt tänne postittamastani koodista vahingossa pois (alkuperäisessä oikein) ja ongelmankäsittelyn poisjättäminen on vain omaa laiskuuttani.

Tuon host -määrityksen jääminen pois minulta oli varmaankin se suurin syy, miksi en saanut toimimaan. Kokeilin myös /index.php:ta, mutta hosti oli unohtunut luullessani sitä tarpeettomaksi.

Alunperin olinkin jättänyt http:n pois, mutta virheen korjaamista yrittäessäni testasin sen lisäämistä ja se jäi siihen.

Nyt kaikki on selvää, pitänee jatkossa todellakin totutella virheentunnistuksen laittamiseen.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta