.[ ČeskéHry.cz ].
Síťový multiplayer

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Sítě
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Vlatom



Založen: 29. 03. 2011
Příspěvky: 19

PříspěvekZaslal: 24. září 2011, 09:29:41    Předmět: Síťový multiplayer Odpovědět s citátem

Zdravim, začal jsem se trochu zajímat o vytváření sítových aplikací v C#, ale bohužel jsem narazil na problém - mám napsanou konzolovou aplikaci, která se připojí k serveru (veřejná IP) a odešle mu nějaké informace (používám TCP client/server), server po připojení klienta odešle klientovy zprávu o úspěšném připojení... Jenže zde nastává problém, když je klient za routerem a nemá nastavený port forwarding pro port který jsem zvolil ke komunikaci tak zpráva prostě nedojde. Proto bych se chtěl zeptat jak tuto situaci řeší hry jako např CoD, Battlefield apod. (mám napsanou i menší hříčku v XNA, kde už mám vyřešené zpracování bufferu atd., proto bych to nechtěl zahodit a dozvědět se o tom něco víc)

Děkuji za odpověd.

PS: Omlouvám se za dualpost
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 24. září 2011, 12:22:39    Předmět: Odpovědět s citátem

port forward je potrebny iba na strane klienta. ak to prejde od klienta k serveru tak to musi ist aj naopak.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
TeaTime



Založen: 17. 06. 2011
Příspěvky: 264

PříspěvekZaslal: 24. září 2011, 14:20:33    Předmět: Pošli zdrojáky Odpovědět s citátem

Ahoj,
ke komunikaci typu server-klient stačí mít veřejnou ip na serveru a klient může být klidně za NATem. Pokud ani server nemá veřejnou ip, dá se to řešit právě port forwardingem na straně serveru (http://cs.wikipedia.org/wiki/Přesměrování_portu). Myslím, že si to nou plete.

Už jsem někdy viděl, že nějaký začátečník měl podobný problém jako ty. Měl networking navrhnutý tak, že měl na serveru i klientovi spuštěný serverový socket a vždy posílal data jen z klientského socketu na serverový. Takže měl jakoby na obou stranách server i klienta, takže měl dvě spojení a každým komunikoval jen jedním směrem.

Taky je dost možné, že máš prostě jen chybu ve zdrojových kódem a omylem to pokládáš za chybu směrování portů. Kdyžtak sem hoď nějaký výřez zdrojáků - jak se připojuješ k serveru a klientovi a jak posíláš data tam i zpátky.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vlatom



Založen: 29. 03. 2011
Příspěvky: 19

PříspěvekZaslal: 24. září 2011, 14:30:39    Předmět: Odpovědět s citátem

TeaTime: Tak to mám - klient a server jede jak na straně serveru tak i klienta. Jde to vyřešit jinak?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
TeaTime



Založen: 17. 06. 2011
Příspěvky: 264

PříspěvekZaslal: 24. září 2011, 15:11:01    Předmět: Jasně Odpovědět s citátem

Jasně, bez problémů. Na serveru máš jenom serverový socket, na klientu jen klientský socket. Když dojde k navázíní spojení, tak už vpodstatě nemusíš řešit, který z nich je serverový a který klientský - prostě když chceš poslat jedním směrem data, tak užiješ funkci send (to platí pro c++, c# pro to bude mít nějakou podobnou funkci) a když chceš data na druhý straně přijmout, tak použiješ recv (nebo nějaký jeho C# ekvivalent).

Takže pseudokódem by to mohlo vypadat asi takto:
(je to trochu c++ pseudokód)

server:
kód:

socket s;
inicializuj_socket(s);
počkej_než_se_přihlásí_klient_a_připoj_ho(s);
while(1)
{
  Data d;
  recv(s, d);                             // přijmeme data od klienta
  send(s, Data("požadavek přijat"));      // odešleme mu zpátky potvrzení o přijetí dat
}


klient:
kód:

socket s;
inicializuj_socket(s);
připoj_se_k_serveru(s);
while(1)
{
  Data d;
  cin >> d;                     // přečteme, co zadal uživatel
  send(s, d);                   // pošleme to serveru
  recv(s, d);                   // přijmeme odpověď serveru
  cout << "server: " << d;      // vypíšeme odpověď serveru
}


Takže jak vidíš, klient i server má každý jeden socket a pomocí něho odesílají i přijímají data. Tady je pak samozřejmě obtížnější zajistit synchronizaci komunikace - aby se nestalo, že klient i server čekají na odpověď toho druhého, který ovšem taky čeká na odpověď. To se dá řešit buď neblokujícím režimem socketů, nebo příkazem select (tedy opět spíše jeho C# ekvivalentem). Ale to už je zas něco jiného.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vlatom



Založen: 29. 03. 2011
Příspěvky: 19

PříspěvekZaslal: 24. září 2011, 17:04:23    Předmět: Odpovědět s citátem

Zkusím, díky moc Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vlatom



Založen: 29. 03. 2011
Příspěvky: 19

PříspěvekZaslal: 5. říjen 2011, 18:58:15    Předmět: Odpovědět s citátem

Funguje tak jak má, děkuju moc za radu Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Al



Založen: 23. 10. 2007
Příspěvky: 196

PříspěvekZaslal: 5. říjen 2011, 22:03:05    Předmět: Odpovědět s citátem

Principiálně: Ve skutečnosti u TCP neexistuje žádný "serverový socket" a "klientský socket". Všechny sockety jsou stejné a navázané spojení je obousměrné. Serverovou funkcionalitu a jeho IP adresu potřebujeme jen k navázání spojení. Pak dokud to spojení držíme, komunikujeme socketem, který je fakt na obou stranách spojení stejný. Jinak má TeaTime pravdu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vlatom



Založen: 29. 03. 2011
Příspěvky: 19

PříspěvekZaslal: 16. říjen 2011, 21:40:26    Předmět: Odpovědět s citátem

Ještě bych se ctěl zeptat zdejších odborníků - a jak je to s UDP? UDP nevytváří obousměrné spojení, ne? Takže pokud bych chtěl TCP změnit na UDP, jak na to? Předem díky za odpověď!

Googlil jsem tak dlouho až se mi z toho v hlavě udělal pořádnej guláš, takže kdyby mi byl schopnej někdy vysvětlit jak na to, byl bych mu vděčnej...
_________________
R.I.P. Steve Jobs!
R.I.P. Dennis Ritchie!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 16. říjen 2011, 22:27:46    Předmět: Odpovědět s citátem

UDP hlavne nevytvara absoultne ziadne spojenie. ono si vytvoris socket priradis ho k nejakej adrese a portu a mozes posielat z neho data na hocijaku adresu a port. takze v pripade UDP proste kazda strana pocuva na jednom sockete.

takze ked ti pride z nejakej adresy a portu datagram tak mozes predpokladat ze odpoved mozes poslat na tuto adresu port. (nemusi to tak byt ale tu ide o to ako to naprogramujes).
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vlatom



Založen: 29. 03. 2011
Příspěvky: 19

PříspěvekZaslal: 17. říjen 2011, 13:03:30    Předmět: Odpovědět s citátem

Asi zůstanu u TCP...
_________________
R.I.P. Steve Jobs!
R.I.P. Dennis Ritchie!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Al



Založen: 23. 10. 2007
Příspěvky: 196

PříspěvekZaslal: 21. říjen 2011, 17:38:57    Předmět: Odpovědět s citátem

TCP a UDP jsou tak strašlivě odlišné, že by mělo být velmi snadné pro každou konkrétní aplikaci vybrat, který z nich je ten správný. UDP se používá tam, kde jen jednou jednorázově pošlu jednu informaci, která se vejde do jednoho paketu, a nevadí mi, že občas se ta zpráva ztratí. Má výhodu, že méně zatěžuje síť, což bylo výborné v minulosti na pomalých sítích. Ale má nevýhodu, že adresát musí být dostupný pomocí IP adresy. IP adresy jsou dostupné třeba v rámci stejné podsítě či většinou celé tzv. lokální sítě.

No a TCP je méně efektivní na síť a používá se hlavně tam, kde UDP nevyhoví. Smile Třeba na internetu UDP moc nefunguje kvůli absenci veřejných IPv4 adres, často taky potřebujeme poslat víc než jen jeden paket.

Pozn. Samotná jednorázovost poslání dat není sama o sobě směrodatná, UDP umožní poslat i víc dat za sebou, ale je to tam zbytečně komplikované, protože protokol nezaručuje ani pořadí dat, ani negarantuje doručení všech částí. Nakonec ze snahy použít UDP můžeme dojít až k tomu, že si nechtěně a velmi pracně naprogramujeme vlastní obdobu TCP nad UDP. Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Sítě Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna