Online netwerk maken in C++

Status
Niet open voor verdere reacties.
Mijn server een vast IP adres geven? Bedoel je het adres van mijn host?

Hij bedoelt dat je je DHCP functie moet uitschakelen op de server host en dan vervolgens een Static IP aan te nemen. Klik

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

Ik zou de 0.0.0.0 veranderen in het loopback adres: 127.0.0.1, dan kan je sowieso alle verbindingen accepteren.

En wat is DHCP?

Een stukje software in je router die IP adressen uitdeeld, helaas verlopen ze na ongeveer 24 uur (ligt aan je instelling), dan krijg een computer een nieuwe toegewezen, daarom is het niet handig je port te forwarden naar een DHCP aangewezen adres, na 24 uur werkt het niet meer.

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:

Als je dat allemaal gedaan hebt, kloppen deze instellingen. Veel succes! :)
 
Wel dit Warcraft2 spel moet af zijn tegen mei-juni. Dit is voor school :-)

En 'volleerde programmeurs'. Er zijn altijd programmeurs die niets zo goed zijn in een bedrijf :-)
En ik kan heel ( met de nadruk op héél ) snel programmeren. Alle code zit in mijn hoofd, enkel het typwerk moet ik doen ^^
En soms opzoekingswerk voor networking nu :)

Maar ik zou graag terug on-topic gaan aangezien het me nog steeds niet lukt =(

Warcraft 2 is btw een redelijk simpele game om te programmeren aangezien het nog geen 3D is. Het is wel '2.5D' omdat je speelt via een zijaanzicht. Dat maakt de algoritmen die nodig zijn om het spel te maken 'iets' moeilijker. ^^
 
Ik heb alles gedaan zoals je zei, maar het werkt nog steeds niet.

Maar even een vraag, Mijn LAN-verbinding.. Ik zie dat hij niet aangesloten is..

Ik probeer mijn verbinding te doen met mijn router, draadloos.. Dus enkel mijn draadloze netwerkverbinding staat actief.
Ik heb dus mijn static IP aan mijn draadloos netwerk gegeven. En het werkt dan ook nog niet =/

Ik heb geen flauw idee wat ik nu verkeerd doe :s

Draadloze netwerkverbinding -> Eigenschappen -> Internet Protocol versie 4(TCP/IPv4) -> Eigenschappen:
IP-adres: 192.168.1.104
Subnetmasker: 255.255.225.0


Op mijn router heb ik een port forwarding gemaakt:
IP-adres: 192.168.1.104
Protocil: TCP
Port range: 3000 - 3000


Dan in mijn code:
// host
m_MyAdress.sin_family = AF_INET;
m_MyAdress.sin_addr.s_addr = inet_addr("127.0.0.1"); // De loopback zodat ik alles verbindingen accepteer
m_MyAdress.sin_port = htons(3000);

// Client
m_MyAdress.sin_family = AF_INET;
m_MyAdress.sin_addr.s_addr = inet_addr("178.119.110.210"); // dit is mijn WAN IP-adress
m_MyAdress.sin_port = htons(3000);

Ik zie niet echt mijn probleem :s


EDIT:
Ik zie dat ik op mijn WAN interface setup van de router ook op Static IP kan veranderen. Maar dat moet ik een DNS 1 ingeven? Maar ik vermoed dat ik mijn WAN interface niet mag veranderen van de router?
 
Laatst bewerkt:
Probeer je server is te bind()en op INADDR_ANY, uit m'n hoofd is dat hetzelfde, maar het proberen waard.

Ook zal je niet de eerste zijn die gewoon een goed werkende server heeft gemaakt, maar niet kan verbinden omdat in sommige netwerk situaties het gewoon niet mogelijk is om vanuit een LAN netwerk over het WAN netwerk te verbinden naar een server binnen datzelfde LAN netwerk; als je begrijpt wat ik bedoel :P. In dat geval zou ik een vriend ofzo vragen om te proberen te verbinden...

EDIT:

Herinner me net deze thread van iemand die precies dat probleem had: http://www.helpmij.nl/forum/showthread.php/638403-Socket-programmeren
 
Laatst bewerkt:
Nope werkt niet..
Ik heb mijn client al doorgestuurd naar 4 andere personen met overal verschillende instellingen en niks werkt :(

Maar ik wil een verbinding maken van laptop -> router -> laptop .. Dan heb ik toch geen WAN IP adress nodig om naar te connecten?

Moet ik het IP adres die ik ge-port-forward heb niet doorgeven aan mijn client?

Ik heb het IP adres 192.168.1.150 ge-port-forward. Met poort 5000.
Moet ik dan niet direct aan mijn client zeggen, connect met IP 192.168.1.150 met poort 5000?

Mijn WAN IP adress is een externe IP adress. Dat heb ik toch niet nodig als ik LAN draadloos wil verbinden?
Ik ga denk ik een boekje downloaden over networking zodat ik alles beter begrijp..
Tenzij er iemand vlug wat C++ code wil schrijven van een server die online kan werken.. :P
De bedoeling is dat ik in dit weekend een online netwerk kan maken. :-)
 
1) 0.0.0.0 als ipadres is prima, dat betekend dat je bind aan inkomende adressen. IPADDR_ANY is ook prima. 127.0.0.1 werkt niet op alle systemen als goed adres!
2) laptop met de server moet liefst een fixed IP hebben buiten de DHCP range (100-200) daarom stelde ik .50 voor.
3) direct connecten van de andere laptop op .50 moet zoiezo werken. Indien dit niet werkt moet je eerst dit oplossen.
4) daarna je port forward nog eens goed nalopen.
5) telnet is een handige tool meegeleverd met windows (hoewel zelf nog aanvinken in programma's in windows 7/vista) Kun je snel op een port verbinden en zien of je feedback krijgt. Telnet is een universele "client" waarmee ik vaak mijn servers test. vanaf de andere laptop: TELNET 192.168.1.50 3000 Indien dit werkt testen op TELNET 178.119.110.210 3000
6) mocht het alleen fout gaan op stap twee, reset uw router eens na het invoeren van de forward.
 
Maar ik wil een verbinding maken van laptop -> router -> laptop .. Dan heb ik toch geen WAN IP adress nodig om naar te connecten?

Moet ik het IP adres die ik ge-port-forward heb niet doorgeven aan mijn client?

Ik heb het IP adres 192.168.1.150 ge-port-forward. Met poort 5000.
Moet ik dan niet direct aan mijn client zeggen, connect met IP 192.168.1.150 met poort 5000?

Mijn WAN IP adress is een externe IP adress. Dat heb ik toch niet nodig als ik LAN draadloos wil verbinden?

Klopt, als je alleen maar binnen je LAN wilt verbinden heb je geen port forwarding nodig. De firewall die de verbindingen tegenhoudt zit namelijk tussen de WAN en de LAN.

Heb je ook al de firewalls op je eigen computers geconfigureerd? Soms leveren die ook problemen, ligt aan je antivirus software.

Dit is ongeveer hoe het werkt; let op dat je dus alleen port-forwarding nodig hebt als je verbinding buiten de router komt, dus zodra je je external ip gebruikt. Het internal IP van je router (de gateway) is meestal 192.168.1.1 (192.168.0.1), maar dit ligt ook aan je instellingen. Dit ip heb je nooit nodig, maar aangezien je veel over netwerken wilt weten is het wel handig om te weten. :)

network_wan_lan.png
 
Laatst bewerkt:
Ok, het is mij gelukt om LAN te geraken via de router. :-)

Ik probeer nu WAN te gaan..

Ik heb in mijn router instellingen een port forwarding gedaan:
IP adres: 192.168.1.10
Protocol: TCP
Port range: 3000 - 3000

Ik heb mijn host de poort 3000 laten hosten.
Mijn client moet verbinden naar mijn IP adres: 213.118.200.216 met de poort: 3000

Ik heb op mijn firewall de poort 3000 opengezet.

Ik heb mijn LAN-connectie op het IP adres 192.168.1.10 gezet.



Maar waarom werkt dit niet :s
Ik heb op mijn andere laptop TELNET aangezet en hij zegt dat hij geen verbinding kan maken met de poort 3000
Ik kan toch moeilijk het LAN-connectie, IP adress naar 192.168.1.5 brengen hé van de Client? Want ik wil graag dat gelijk wel IP adres kan connecten aan mij. Dus ik wil niets van de Client veranderen.
 
Laatst bewerkt:
Kan je de code geven waarin je client connect, en het stukje waarin je je server bind? Je router instellingen zijn goed maar ik snap niet helemaal wat je nou met je code heb gedaan...
 
Dit gebruik ik in de main.cpp om te connecten.

// ipADress = 213.118.200.216
// iPort = 3000
client.ConnectToServer( ipAdress, iPort );



Dit is de methode:
void ClientSocket::ConnectToServer( char* ipAddress, int port )
{
m_ServerInfo.sin_family = AF_INET;
m_ServerInfo.sin_addr.s_addr = inet_addr( ipAddress );
m_ServerInfo.sin_port = htons( port );

if( connect( m_ClientSocket, (LPSOCKADDR)&m_ServerInfo, sizeof(struct sockaddr) ) == SOCKET_ERROR )
{
ReportError( WSAGetLastError(), "connect()" );
CloseConnection();
exit(0);
}
}
 
En wat gebruik je in de server voor bind()en? En wat gebeurt er als je probeert te verbinden, welke foutmelding krijg je met WSAGetLastError()?
 
bind
// port = 3000
m_ServerInfo.sin_family = AF_INET;
m_ServerInfo.sin_addr.s_addr = inet_addr( "0.0.0.0" );
m_ServerInfo.sin_port = htons( port );
if( bind( m_ListeningSocket, (LPSOCKADDR)&m_ServerInfo, sizeof(struct sockaddr) ) == SOCKET_ERROR )
{
ReportError( WSAGetLastError(), "bind()" );
CloseConnection();
exit(0);
}

listen
if( listen( m_ListeningSocket, 1 ) == SOCKET_ERROR )
{
ReportError( WSAGetLastError(), "listen()" );
CloseConnection();
exit(0);
}

accept
SOCKET tempSocket = SOCKET_ERROR;
while( tempSocket == SOCKET_ERROR )
{
tempSocket = accept( m_ListeningSocket, NULL, NULL );
Sleep(1);
}
m_Client = tempSocket;



De GetLastError is 10065 bij de methode connect(). Dit is dat het te lang duurde om 'proberen' te connecten.
 
Ziet er goed uit, probeer eens te debuggen in de server, komt de server bijvoorbeeld ooit bij de accept() functie? Of gaat het al in de router fout?

Anders zou ik ook nog proberen of het je vrienden wel lukt te verbinden, zoals ik al eerder zei is dat vaak ook het probleem...
 
De host/server blijft in de while lus zitten van accept. Dus de host werkt degelijk

Zodra ik de client openzet, dan geraakt hij bij de methode connect(), en er word SOCKET_ERROR gereturned waardoor hij dus niet geconnect is en afsluit.

Ik heb het geprobeerd met het versturen naar vrienden maar bij hun krijgen ze ook de errorcode 10065.


Maar het is toch niet de bedoeling dat degene waarnaar ik het stuur zijn LAN properties toch ook veranderd hé?
 
Laatst bewerkt:
Nee, alleen de server hoeft z'n poort open te zetten, de client zal namelijk altijd verbinding zoeken met de server ipv andersom. (volgens het Client-Server model) Zodra de client verbinding zoekt met jou external IP, vind hij je router, deze zal in zijn Port Forwarding rules zoeken naar een regel voor poort 3000, de router ontdekt dat hij alle connecties moet doorsturen naar 192.168.1.10 en doet dat dan, dan komt de verbinding aan op de server en kan hij worden verwerkt.
 
Is het mogelijk dat mijn antivirus ook poorten kan blokkeren?
Ik gebruik Avast, iemand een idee hoe ik die instellingen kan bekijken indien deze poorten kan blokkeren?

Echt raar dat mijn connectie niet werkt.. :s Alles klopt nochtans en de client wil de host ni vinden.
 
Ik probeer nu mijn C-style code naar C++-style code om te zetten maar de recv functie is daar precies niet blij om..


De recv functie wilt enkel een char* als buffer. Maar het probleem is bij een string dat hij een const char* returned met .c_str();

Ik heb even opgezocht en ik vond een oplossing met een char temp[256]; die werkt gebruikt om de tekst even op te slaan.
Maar ik wil die oplossing niet gebruiken om '256' een lange array is voor een kleine tekst en omdat het C-style is.

Hoe kan ik die recv functie simpel oplossing met enkel C++ code? Ik moet ook een lengte meegeven maar ik wil die lengte niet hardcoden. Weet iemand een oplossing hoe ik dit doe?
 
Ik zou toch een buffer hardcoden, alleen dan eentje die iets groter is, bijvoorbeeld 1024 bytes. Je kan de rest dan terug converteren met de lengte van de buffer die je ontvangt, zoiets:

Code:
char recvBuffer[1024];
unsigned int recvBufferSize = recv( ... recvBuffer ... );

string recvMessage = string(recvBuffer, recvBufferSize);

Tweede optie, heb ik nooit getest maar werkt misschien, is het gebruiken van cont_cast om de const char* in een char* te veranderen:

Code:
const char* oldbuffer;

... recv ...

char* newbuffer = const_cast<char*>oldbuffer;
 
Ik merk net op dat TCHAR zowel char als wchar_t kan zijn :-)
Dit betekent dat ik een buffer kan maken met een TCHAR* om de data bij te houden. En ik zal deze dat omzetten naar een tstring( wat string of wstring kan zijn )

Thanks voor uw respons!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan