Online netwerk maken in C++

Status
Niet open voor verdere reacties.

turbello

Gebruiker
Lid geworden
23 nov 2011
Berichten
25
Hallo iedereen, ik ben hier nieuw :)

Ik ben momenteel bezig met networking. Ik heb zojuist een chatvenster gemaakt waarmee ik op mijn laptop een client en een host heb (door 2x dezelfde .exe file te openen). Ik kan berichten versturen van client -> host en omgekeerd.

Dit is redelijk basic/simpel en ik wil graag een grote stap verder zetten.
Ik wil namelijk nu code schrijven waarmee ik kan chatten zoals MSN. Wel niet zo geavanceerd als MSN maar ik wil gewoon berichten kunnen verzenden en ontvangen via het internet.
Maar ik heb geen enkel idee hoe ik hieraan begin :confused:

Voor het chatvenster dat ik zojuist heb gemaakt heb ik WinSock.h gebruikt.
Ik kan alle tips gebruiken! Volgend jaar doe ik mee aan een internationale wedstrijd en ik zou er graag networking willen implementeren in mijn game.

Zoals je leest 'game', de bedoeling is dat is dus via het internet de positie , collisionmeshes, etc moet kunnen doorgeven. Maar zodra ik weet hoe je het met tekst doet is de rest kinderspel :)

Alvast bedankt!!
Met vriendelijke groeten,
Jonathan

Edit: ik werk met windows ( ik zeg dit omdat sommige tutorials voor bvb Linux anders zijn dan die voor windows ).
 
Laatst bewerkt:
C++ is hetzelfde geimplementeerd op linux en windows.

Winsock is wel een specifieke "wrapper" om de standaard socket class. Indien je al gewerkt hebt met sockets ben je er in principe al. je bent er klaar voor :)

Sockets lokaal of de andere kant van de wereld is niet anders. Je moet alleen wat meer zekerheden inbouwen. Als het echter eenmaal met elkaar verbonden is is er geen verschil meer met je huidige implementatie.
 
Ik heb enkel tutorials gevolgd en daarop werd er nochtans gezegd dat er bepaalde keywords anders zijn. Maar swat daarom ben ik hier niet :D

Even offtopic: amai 31 lezers op zo een korte tijd oO Er is precies veel activiteit op dit forum?

En nu weer ontopic:
'Ik ben er klaar voor'. Dat weet ik niet zo zeker want ik heb een probleem met het IP adres.

Als ik het ip adres '127.0.0.1' ingeef aan mijn client. Dan werkt alles zoals het zou moeten.
Maar als ik dan mijn echt ip adres wil ingeven werkt dit niet meer. De client vindt mijn ip adres niet. ( tip: om uw ip adres snel te weten gewoon op deze site gaan: http://www.watismijnip.be/ )

En ik ben er in principe al? Hoezo want ik weet echt niet hoe zo een internet verbinding werkt. Uiteraard het ip adres zal van een andere computer/laptop zijn maar moet ik nog iets speciaals hebben? Moet ik bvb betalen om iets op het internet te versturen? Een server ofzo.. ( sorry dat ik aan het gokken ben maar over puur networking weet ik nog niets ).

Ik studeer Digital Arts & Entertainment en dat zijn games maken. Networking krijgen we pas in het laatste jaar maar ik leer graag dus ik wil nu al weten hoe ik het doe. :-)


Zou U eventueel wat pseudo code kunnen schrijven als je wil?
Telkens als ik op google zoek achter een online network krijgen ik die Winsock.. Maar in elke tutorial werken ze met een Client & Host op 1 laptop en daarmee ben ik niet veel want dat kan ik nu al.

Ik ben dus een complete newbie met netwerken :o
 
toch is er werkelijk geen verschil. vergeet alleen niet: als je uw externe adres gebruikt moet de poort die je wil bereiken in de router wel open staan! dat is in principe niet anders dan als je een andere server opzet binnen het eigen netwerk.

alle verkeer en instandhouding wordt gedaan door de socket classes. je hoeft alleen maar read en write aan te roepen en af te handelen. Je kunt verder alles versturen, text, data, etc.

NU, er zijn natuurlijk nog wel veel dingen die er bij komen kijken. Threads, blocking/non-blocking poorten, streams of eigen data management. Er kan heel veel met deze classes. Ik wil ook niet zeggen dat het eenvoudig is om aan te leren, maar in principe kun je een volledige server schrijven met alleen de "socket" class. Het is de afhandeling van vele aangesloten clients die het schrijven van een MSN server moeilijk maakt, maar een chat server voor, zeg, 20 mensen kun je in een middagje schrijven.
 
Ik heb net gezocht achter een docent die enorm goed is met networking.
Zoals je al zei wampier, ik heb alle code al, ik ben er bijna. :)

Hij zei dat ik een poort moet openmaken ( poort groter dan 1400 van telenet blokkeert alle poorten onder de 1400 ). En dan moet ik nog port forwarding doen.
Hij raadde me aan om eerst een netwerk te maken tussen 2 laptops in LAN. Met elk een apart IP adres.

die chat server dat je zegt wampier, zou die ook werken met port forwarding of heb jij een betere/andere manier? ( om het simpeler te houden )
 
Port forwarding is een noodzaak achter een consumenten router. Dat heeft niets van doen met eender welk programma, maar om de buitenwereld kenbaar te maken hoe ze op een interne poort geraken van buiten.

Stel je hebt 3 computers achter een NAT-router (99% van de consumenten-routers) en de buitenwereld vraagt naar poort 80.... welke poort 80 dan? op welke computer, en is die poort 80 intern ook 80, of is die intern poort 100? De port forward is hoe de router weet waar een gevraagde poort op het interne netwerk te vinden is.

alle servers die dus van buiten (extern IP) bereikbaar moeten zijn moeten dus in de router kenbaar gemaakt worden. Daarom raadt de docent ook aan om twee computers binnen hetzelfde netwerk eerst te proberen, dan hoef je je in ieder geval geen zorgen te maken dat je een foute instelling in je router doet.
 
Bedankt! Je hebt me vandaag al heel veel geholpen! ;-)

Hiermee kan ik wel even verder.
Nog iets, ik wil mijn game, dat online speelbaar gaat zijn, met een installer laten werken. Zodat iedereen het spel eerst moet installeren.

Maar moet ik dan op hun laptop/computer iets doen met hun router/ports? Of moet ik enkel mijn router port forwarden en is alles dan OK?

Of is het enkel de bedoeling dat ze dat gewoon installen, en dat in die code mijn IP adres en port zit waarmee ze kunnen verbinden?


Ik vraag dit door het volgende: bij het spel COD: MW3 en oudere games is er per game een host. En die host is een speler. Hoe werkt zoiets dan? Dan moet ik toch dingen kunnen veranderen aan die spelers hun poorten om hun een host te maken van een game? Sorry voor al die vragen vandaag ben ik hou van programmeren en ik wil alles weten/kunnen. :-)
 
Dat iemand de game host is betekent dat zijn computer (of console) de server speelt.

Je hebt waarschijnlijk een Lobby server van de makers van het spel die je een lijst met games geeft. Als je er aan eentje mee wil doen dan brengt die Lobby server je in contact met de host van de game. Verder doet de Lobby server niks.

Zodra je dan in de game zit, worden alle berichtjes (ik loop, ik schiet, ik pak een health pack) naar de host gestuurd. De host verwerkt die pakketjes dan en geeft jou daar antwoord op (je staat nu hier, er vliegt nu een kogel van je die kant op, je hebt nu 100 meer health).

De host is dus de enige met de werkelijke toestand van het spel. Alle andere spelers sturen hun input naar de host en krijgen dan van de host de laatst bekende toestand teruggestuurd, waardoor ze dus een beetje achterlopen. Nu zijn er veel technieken om toch vloeiend te bewegen en te compenseren voor "lag".

Het mooie aan het toewijzen van een host is dat het grootste dataverkeer over links tussen de spelers zelf loopt en niet per se via een server van de maker van het spel. Dit scheelt heel wat aan kosten voor bandbreedte.
 
Laatst bewerkt:
Als aanvulling op Arjan. MW doet het iets anders. Tenzij je in netwerken gaat duiken wordt het misschien wat ingewikkeld, maar ik ga het toch proberen. MW gebruikt een teruggaand pad dat de host eerst heeft gemaakt door in de centrale server in te loggen. Zo werkt het ook als je zelf een website opvraagt.

jij begint een stream door een website op te vragen. Je aanvraag komt bij de router en die geeft je stream een "willekeurig" extern poort nummer. De website stuurt de pagina terug naar je externe IP op de, door de router, toegewezen poort. Daar de router de connectie tussen je pc en dit poortnummer zelf heeft gemaakt weet de router waar de teruggestuurde informatie naar toe moet. Verkeer dat van binnen wordt gestart wordt dus automatisch door de router "geforward".

Nu, bij MW log je zelf eerst in op een centrale server. Daardoor ontstaat er een automatische "forward", vervolgens wordt over dit pad de gamedata gestuurd als je host bent. Uiteindelijk is er dus nog steeds een server nodig, hoe kort ook. Ik heb een en ander in mijn uitleg versimpeld, maar dit is de basis.
 
Hartelijk bedankt!
Ik heb dat chat serverke gemaakt in een cmd vernster en ik ga zo dadelijk proberen tussen 2 laptops LAN verbinding te maken, en dan zien op internet hoe ik mijn router port forward :-)

En zodra het me dan lukt via de router n schrijf ik een game engine ( in een windows application , geen cmd venster ) waarin ik die networking ga implementeren.

EDIT: dit is een vraag naar de admins toe: zou het mogelijk zijn om een nieuw topic in programmeren te zetten 'Tutorials'? Waarin iedereen die zin heeft een tutorial kan schrijven over een onderwerp. ( algoritmen, netwerken, bitmaps inladen, DirectX, OpenGl, etc )
 
Laatst bewerkt:
Edit ( voor degene die mijn vraag zagen, laat maar ik heb de fout al gevonden ) :-)

Het laatste probleem dat ik heb nu is:
als ik 1 venster ( client of host ) sluit, dan blokkeert het ander venster en krijg ik een error/venster dat het niet meer reageert.
 
Laatst bewerkt:
Dat komt mogelijk door hoe je je code geimplementeerd hebt. mogelijk gebruikt je een endless while of andere loop zonder te detecteren of clients weggaan e.d. Dat is zonder code natuurlijk moeilijk te zeggen
 
Dat is waar, ik check nog niet of er een client weggaat.

Buiten dat, alles werkt ( tot bij het afsluiten dan ). En nu heb ik mijn 2e laptop aangesloten en hem mijn client gegeven.

Als ik mijn host run, en dan op de andere laptop de client, vind de client mij(de host) nog steeds niet :(

Ik zal wat code posten over het connecten:

// Ik call de functie:
sockClient.ConnectToServer( _T("100.100.100.100"), 3000 );

// In die functie zit:
void ClientSocket::ConnectToServer( const tstring& ipAddress, int port)
{
m_MyAdress.sin_family = AF_INET;
m_MyAdress.sin_addr.s_addr = inet_addr(ipAddress.c_str());
m_MyAdress.sin_port = htons(port);

if( connect(m_MySocket, (SOCKADDR*)&m_MyAdress, sizeof(m_MyAdress)) == SOCKET_ERROR )
{
ReportError( WSAGetLastError(), _T("connect()") );
CloseConnection();
Sleep(4000);
exit(0);
}
}


Ik heb mijn IP adress van mijn laptop 100.100.100.100 gegeven, en mijn andere laptop 111.111.111.111
Ik heb op deze laptop op mijn firewall de poort 3000 opengezet.

En toch vindt de client me niet =/ :(


Edit: errorcode is 10065. Even opgezocht en het betekent dat hij geen weg vind naar de host.
 
Laatst bewerkt:
dat kan kloppen. ze zitten nu namelijk niet in hetzelfde netwerk. Het is beter 2 vaste addressen te nemen in je thuis netwerk.

bijvoorbeeld 192.168.1.5 en 192.168.1.10

Je kan dit wel werkend maken, maar ik zou het nog simpel houden, anders moet je ook een cursus netwerken gaan doen ;)
 
It's alive !! Bedankt!

Ik heb nu connectie tussen beide laptops :D
Ok next, via de router verbinding maken. :)

EDIT:

Ik probeer nu een verbinding te maken tussen beide laptops via de router. Als ik nu de client run komt de foutecode 'connection timed out'

Dit is mijn IP adres voor WAN: 178.119.110.210
Dit voor LAN: 192.168.1.254

Beide laptops hebben hetzelfde IP adres want ze zitten op dezelfde router. :-)

Als ik op de router instellingen ga op LAN zie ik dat er een client range is:
192.168.1.100 < --- > 192.168.1.200


Als ik de client laat verbinden naar IP adres: 192.168.1.102 dan duurt het iets langer vooraleer hij zegt dat hij de host niet vindt. Dus daar probeert hij duidelijk te connecteren. Maar toch connect hij niet. :(

Ik heb nog geen port forwarding gedaan want ik weet niet of dit nodig is. Mijn firewall heeft poort 3000 openstaan en daarop host ik. Ik laat mijn client verbinden op die poort maar niets.. :(


PS: ik probeer het niet simpel te houden want ik moet dit zéér snel onder de knie krijgen. Volgend jaar is de wedstrijd en ik moet alles weten van networking en algoritmes etc etc..
En dit jaar maken we een game en wil ik mijn networking oefenen door het te implementeren in mijn game. :-)
 
Laatst bewerkt:
geef je "server" een vast IP adres. neem bijvoorbeeld 192.168.1.50. Forward dan in de router poort 3000 naar 192.168.1.50. Forwarden naar een DHCP adres is niet stabiel.

Laat de andere laptop op DHCP en verbind naar 179.119.110.210 : 3000

Dan zou het moeten werken
 
Misschien niet geheel on-topic, maar wat voor soort games heb je al gemaakt? Een real-time game over een netwerk laten lopen moet je niet onderschatten ^^.

Als die game wedstrijd bijvoorbeeld Global Game Jam is waar je binnen 48 uur een game moet produceren, zou ik multiplayer over een network gewoon vergeten.

Verder natuurlijk niks tegen het leren erover! Succes!
 
Mijn server een vast IP adres geven? Bedoel je het adres van mijn host?

Dit doe ik voor de host te laten hosten:

m_MyAdress.sin_family = AF_INET;
m_MyAdress.sin_addr.s_addr = inet_addr("0.0.0.0");
m_MyAdress.sin_port = htons(port);

Als ik die 0.0.0.0 verander in dat vast IP adres krijg ik een fout dat hij niet kan hosten


En wat is DHCP?
Het enige wat ik kan invullen bij port forwarding is het IP adres, Protocol, Port range en Comment.

En daarin heb ik dus ingevuld
IP adress: 192.168.1.50
Protocol: TCP
Port range 3000 - 3000
Comment:

En dan laat ik de Client connecten op het IP adres 179.119.110.210 met port 3000
 
@Arjan B, Ik heb het Dragonball Z spel dat je normaal speelt op een gameboy advance gemaakt in C++. Dat was het eerste jaar dat ik C++ deed dus toen kon ik nog geen geweldig game maken. Maar ik was wel één van de beste programmeurs van de 200studenten :)

Dit jaar ben ik veel beter en maak ik Warcraft 2 : Tides of darkness. En dit wil ik MMO maken maar daarvoor moet ik networking leren. :)

Die wedstrijd noemt Imagine cup, je mag 2-3maand werken aan je game, de bedoeling is dat je, met je team, een concept bedenkt en alles zelf schrijft. Je mag wel geen eigen engine schrijven dus ik weet niet precies hoe dat in elkaar zit.
Het is internationaal dus Koreanen en Japanners worden de uitdaging. :D
 
Je begrijpt dat MMO's hele teams van betaalde volleerde programmeurs hebben die er dan jaren aan werken :P?

Ik denk dat je verder komt met een origineel (maar simpel) concept, door dat dan goed uit te werken. Natuurlijk kun je voor een multiplayer game over een netwerk gaan, maar hou het simpel. Een goed gepolijste implementatie van een origineel en leuk idee wegzetten doet het zoveel beter dan een enorme lijst van half afgewerkte features die samen een 'game' vormen. Drie maanden klinkt als veel tijd, maar als je dit naast je studie doet en nog iets aan een sociaal leven wilt overhouden.. Hou het simpel en breid dat pas uit wanneer de main gameplay al te spelen is en je ziet dat je tijd over hebt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan