Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Vlatom
Založen: 29. 03. 2011 Příspěvky: 19
|
Zaslal: 24. září 2011, 09:29:41 Předmět: Síťový multiplayer |
|
|
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 |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 24. září 2011, 12:22:39 Předmět: |
|
|
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 |
|
|
TeaTime
Založen: 17. 06. 2011 Příspěvky: 264
|
Zaslal: 24. září 2011, 14:20:33 Předmět: Pošli zdrojáky |
|
|
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 |
|
|
Vlatom
Založen: 29. 03. 2011 Příspěvky: 19
|
Zaslal: 24. září 2011, 14:30:39 Předmět: |
|
|
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 |
|
|
TeaTime
Založen: 17. 06. 2011 Příspěvky: 264
|
Zaslal: 24. září 2011, 15:11:01 Předmět: Jasně |
|
|
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 |
|
|
Vlatom
Založen: 29. 03. 2011 Příspěvky: 19
|
Zaslal: 24. září 2011, 17:04:23 Předmět: |
|
|
Zkusím, díky moc |
|
Návrat nahoru |
|
|
Vlatom
Založen: 29. 03. 2011 Příspěvky: 19
|
Zaslal: 5. říjen 2011, 18:58:15 Předmět: |
|
|
Funguje tak jak má, děkuju moc za radu |
|
Návrat nahoru |
|
|
Al
Založen: 23. 10. 2007 Příspěvky: 196
|
Zaslal: 5. říjen 2011, 22:03:05 Předmět: |
|
|
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 |
|
|
Vlatom
Založen: 29. 03. 2011 Příspěvky: 19
|
Zaslal: 16. říjen 2011, 21:40:26 Předmět: |
|
|
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 |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 16. říjen 2011, 22:27:46 Předmět: |
|
|
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 |
|
|
Vlatom
Založen: 29. 03. 2011 Příspěvky: 19
|
Zaslal: 17. říjen 2011, 13:03:30 Předmět: |
|
|
Asi zůstanu u TCP... _________________ R.I.P. Steve Jobs!
R.I.P. Dennis Ritchie! |
|
Návrat nahoru |
|
|
Al
Založen: 23. 10. 2007 Příspěvky: 196
|
Zaslal: 21. říjen 2011, 17:38:57 Předmět: |
|
|
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í. 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. |
|
Návrat nahoru |
|
|
|